Aklımda Kalası Kelimeler

* давайте работать вместе
* Zarf ve Mazruf, Zerafet(xHoyratlık) ile aynı kökten(za-ra-fe) gelir
* Bedesten
* Suç subuta ermiştir - Suç sabit olmuştur

7 Nisan 2015 Salı

Grunt, Mocha, Assert ve Should ile temel node.js uygulaması adımları

Grunt

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.

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: