Grunt
Otomasyon için kullanacağızGrunt temel taşımız ...:\> npm install -save-dev grunt Hata olmaya müsait kodlarımız için erken uyarı sistemi: ...:\> npm install -save-dev grunt-contrib-jshint Sürekli sistemi çalıştırmak yerine aktif olarak değişen dosyaları görünce çalıştırsın diye(bir nevi nodemon) ...:\> npm install -save-dev grunt-contrib-watch
Gruntfile.js
ile otomasyon ayarlarımızı yapacağız.module.exports = function(grunt){ grunt.initConfig({ // jshint: hangi klasör(/test/), alt klasörlerin hepsi(/**/) ve adı ne olursa olsun hangi dosya türlerinde(/*js) // olası sorunları inceleyecek jshint:{ files:['test/**/*js'] }, // watch: hangi klasör(/test/), alt klasörlerin hepsi(/**/) ve adı ne olursa olsun hangi dosya türlerinin(/*js) // değişimlerinde otomasyon tekrar başlatarak hangi görevleri çalıştıracak watch:{ files:['test/**/*js'], tasks:['jshint'] } }); grunt.loadNpmTasks("grunt-contrib-jshint"); grunt.loadNpmTasks("grunt-contrib-watch"); }
JSDOC 3.3.0 beta
Eğer javascript dosyalarınızın belgelendirmesini istiyorsanız ve bunu jsdoc3 3.3.0 beta ile yapacaksınız ya kodlarınızın bulunduğu üst klasörlerin isimleri alt çizgi ile başlamayacak ya da node_modules/grunt-jsdoc/conf.json.EXAMPLE dosyasından aynı klasöre conf.json olarak oluşturup içindeki excludePattern'den _ çizgiyi kaldırmak için boşaltacaksınızexcludePattern:""
.Sürekli aldığım sonuç aşağıdaki gibiydi:
C:\_Projeler\AdminLTE\trunk\node\batch>grunt jsdoc Running "jsdoc:dist" (jsdoc) task Documentation generated to C:\_Projeler\AdminLTE\trunk\doc Done, without errors.Ama bir türlü çıktı üretmiyordu. Bunu çözmek için
C:\_Projeler\AdminLTE\trunk\node_modules\grunt-jsdoc\node_modules\jsdoc\conf.json.EXAMPLE
adresindeki dosyanın bir kopyasını jsdoc_conf.json olarak Gruntfile.js ile aynı dizine kaydettim.jsdoc_conf.json
{ "tags": { "allowUnknownTags": true }, "source": { "includePattern": ".+\\.js(doc)?$" }, "plugins": [], "templates": { "cleverLinks": false, "monospaceLinks": false, "default": { "outputSourceFiles": true } } }
ve gruntfile içinede şu taskı tanımladım:
module.exports = function (grunt) { grunt.initConfig({ jsdoc: { dist: { src: ['jsdoc_test/*.js'], options: { destination: 'doc', configure : "jsdoc_conf.json" } } },.....
ve konsoldan grunt jsdoc dediğimde çalışmıştı. Underscore için tedirgin olmama gerek yok çünkü sunucu dizini içindeki dosylarımın ya da istemcideki kendi kodlarımın(bower'ın değil) js belgelendirmesini yapacağım.
MOCHA
Test için kullanacağımız çatı. İçerisinde SHOULD ve ASSERT kullanacağız.Kurulmaları için yapmamız gereken:
Birim testleri yazmak için ...:\> npm install -save-dev assert Davranışsal testler yazmak için ...:\> npm install -save-dev should Bu testleri çalıştırıp bize rapor üretmesini sağlamak için ...:\> npm install -save-dev mocha
Mocha varsayılan olarak test klasöründeki js dosyalarını çalıştıracağından test klasörü içinde test dosyalarımızı tutacağız
Test edilecek dosyamız sanki DB'de Kullanıcı işmizi yaptığımız Kullanici.js dosyamız olsun.
Önce models/Kullanici.js:
// BDD yazmıyoruz bu kodun içinde. Basit Unit Test ler yazdık. var assert = require("assert"); var Kullanici = function (args) { assert.ok(args.eposta && args.sifre, "EPosta ve Şifre boş bırakılamaz"); var f_getKullanici = function (_eposta, _sifre) { return { id:1, adiSoyadi: 'Cem Topkaya', meslegi: 'Yüksek Uzay Müh.' } }; var f_getSonGirisTarihi = function (_kullaniciId) { assert.ok(_kullaniciId, "Kullanıcı ID boş olamaz"); return new Date('2015-04-07 21:51'); }; var temelBilgiler = f_getKullanici(args.eposta, args.sifre); // Dikkat! Revealing module patternini kullanıyoruz return { eposta: args.eposta, temelBilgiler: temelBilgiler, sonGirisTarihi: f_getSonGirisTarihi(temelBilgiler.id) } }; module.exports = Kullanici;
Önce models/DB.js:
var Kullanici = require('./Kullanici'); var DB = { Kullanici:Kullanici }; // Bir namespace gibi hazırlıyoruz. module.exports = DB;
Test kodumuz nasıl peki:
var assert = require("assert"), should = require('should'), DB = require('./../models/DB.js'); describe("Sisteme Giriş", function () { describe("Kullanıcı Girişi", function () { // Aşağıdaki testler erişebilsin diye burada tanımlı var girisYapanKullanici = {}; before(function () { // User modelimiz çalışıyorsa nesne yaratacaktır. girisYapanKullanici = new DB.Kullanici({eposta:'cem@cem.net', sifre:'test12test'}) }); it("kullanıcı temel bilgileri tanımlı", function () { girisYapanKullanici.temelBilgiler.should.be.defined; }); it("şifre tanımlı"); it("şifre 6 karakterden az değil"); }); describe("Kullanıcı Kayıdı", function () { // Aşağıdaki testler erişebilsin diye burada tanımlı var kayitBilgileri = {}; before(function () { // Başlangıçta tanımlanacak bilgiler kayitBilgileri = {eposta:'cemEtCem.Net',sifre:'testSifresiRakamYok'}; }); it('Eposta tanımlı', function () { kayitBilgileri.eposta.should.be.defined; }); it('Eposta doğru girilmiş', function () { assert.notEqual(kayitBilgileri.eposta.indexOf('@'),-1,'eposta @ karakteri içermiyor'); }); it('Şifre en az 6 karakter', function () { assert.ok(kayitBilgileri.sifre.length >= 6, 'Şifre en az 6 karakter olmalı!'); }); }); });
Konsol üstünden hızlıca çalıştırmak için mocha yı globale yükleyebilirsiniz ya da package.json içinde scripts/test özelliğini aşağıdaki gibi doldurabilirsiniz:
{ "name": "jsPattern", "version": "0.0.0", "private": true, "scripts": { "test": "./node_modules/.bin/mocha --reporter spec", "start": "node ./bin/www" }, "dependencies": { "body-parser": "~1.12.0", "cookie-parser": "~1.3.4", "debug": "~2.1.1", "express": "~4.12.2", "jade": "~1.9.2", "morgan": "~1.5.1", "serve-favicon": "~2.2.0" }, "devDependencies": { "grunt": "^0.6.1", "grunt-contrib-jshint": "^0.6.1", "grunt-contrib-watch": "^0.6.1", "mocha": "^2.2.1", "should": "^5.2.0" } }
Artık
...:\>npm test
komutunu çalıştırdığımızda sonucumuz şöyle olacaktır:Sanırım sonucu okumaya gerek yok. Yeşiller geçti kırmızılar kaldı.
Ekran görüntüleri: