業務的な何かやら、ハッカソンなどで使ったので感想

http://sailsjs.org/

名前の通り、Ruby on Rails っぽさがあるフレームワークで、
APIづくりなどで力をいかんなく発揮しそう。

良い所

テストについては、mocha と supertest 、あと barrels を組み合わせて行っています。

supertest は、テスト用にHTTPリクエストのために使って、barrels  は、データベースの初期データなどを用意するために使ってます。以下のような感じでテストが書けてます。

(ココらへんとか参考にしてます。 https://groups.google.com/forum/#!topic/sailsjs/yD6l9ii7R1g)

test/global.test.js

var Sails = require('sails')
  , barrels = require('barrels');

before(function (done) {
  Sails.lift({
    log: {
      level: 'error',

    },
    adapters: {
      // データベースはメモリを使う(テスト終了後に消える)
      default: 'sails-memory'
    },
    // port は 9999 を利用
    port: 9999
  }, function (err, sails) {
    if (err) return done(err);

    this.app = sails;
    // これで test/fixtures の下にある json を元にテストデータが作られる
    // https://github.com/bredikhin/barrels 参照
    this.fixtures = barrels.objects;
    barrels.populate(function (err) {
      done(err);
    });
  });
});

after(function (done) {
  sails.lower(done);
});

test/FooController.test.js

describe('Foo API', function () {
  describe('#find()', function () {
    it('should return ok', function (done) {
      request(app.express.app)
        .get('/foo')
        .set('Accept', 'application/json')
        .expect('Content-Type', /json/)
        .expect(200)
        .end(function (err, res) {
          assert.equal(err, null);
          assert.equal(res.body.result, 'ok');

          done();
        });
    });
});

うーん。ってところ。

  • 0.9時点の話だが、express.js との連携がべったりしてしまっているため、例えばこの処理を取り除きたいというのができなかったりする。0.10だとその辺の処理がざっと変わるらしい。期待したい。
  • ドキュメントに書いていない隠し仕様的なものが、よくあったりするので、結局 sails.js のソースコードを探求することになる。セッションを無効化する場合は、Session 設定の adapter を null にすればよいのだが、この点はドキュメントに一切記されていない。http://sailsjs.org/#!documentation/config.session コントリビュートやらブログなどを書いて、そのへんの知識をまとめていきたい。
  • 公式ドキュメントにテストの書き方的なのが記されてない。
  • 込み入ったことをやろうとすると、Express.js のドキュメントを読みまくる必要があったりする。

今のところ、0.10.0-rc7 が最新の状態なので、0.10 がリリースされたら、もう一度見てみたいかなと思ってます。

node.js で動くWebアプリを作り、mocha などでユニットテストを書きたいというシチューエーションになりました。

しかし、そのWebアプリは request によって外部コンテンツを
参照しているため、なかなかテストが書きにくいです。

そこで、探し出してきた便利ライブラリが nock です。

https://github.com/pgte/nock

このライブラリを使うと、特定のHTTPリクエストを mock することが
できるようです。
下のようなテストコードが、パスします。

var request = require('request')
    , nock = require('nock')
    , assert = require('assert');

describe('http request', function() {
  describe('get request', function() {
    it('should return {"hello": "world"}', function() {
      // mocking http request
      nock('http://www.example.com')
        .get('/data')
        .reply(200, {
          hello: 'world'
        }, {
          'Content-Type': 'application/json'
        }); 

      // request
      request('http://www.example.com/data', function(err, response, body) {
        assert.equal(err, null);
        assert.equal(response.statusCode, 200);
        assert.equal(body, '{"hello":"world"}');
      }); 
    }); 
  }); 
});