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

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 がリリースされたら、もう一度見てみたいかなと思ってます。

Leave a reply

<a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <s> <strike> <strong>