Otomasyon için kullanacağız
Grunt 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ız
excludePattern:""
.
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.
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: