gist

2012年3月19日月曜日

[Node.js] MatadorでMochaを使ったテストを書いてみる

Matadorでmochaを使ったテストをやってみます。

Matadorは前回のエントリーでインストールします。

[Node.js] Matador+CoffeeScriptの環境を構築する

テストフレームワークにMochaとshouldをインストールします。

$ npm install -g mocha should
$ matador init masamune
$ mkdir test

次にテストを書いてみます。モデルからやってみます。

Masamune.test.coffee

app = require('matador').createApp __dirname + '/../'
should = require 'should'

describe 'MasamuneModel', ->
  describe '生成', ->
    it '政宗モデルを生成できる', (done) ->
      MasamuneModel = app.getModel('Masamune', true)
      model = new MasamuneModel()
      should.exist model
      done()


テストを実行してみましょう。

$ mocha

  .

  ✖ 1 of 1 tests failed:

  1) MasamuneModel 生成 政宗モデルを生成できる:
     Error: Unable to find models/MasamuneModel
      at /Users/inouetomoyuki/Dropbox/Projects/node/matador_coffee_sample/node_modules/matador/src/matador.js:78:25
      at /Users/inouetomoyuki/Dropbox/Projects/node/matador_coffee_sample/node_modules/matador/src/matador.js:83:36
      at HTTPServer.getModel (/Users/inouetomoyuki/Dropbox/Projects/node/matador_coffee_sample/node_modules/matador/src/matador.js:201:12)
      at Context.<anonymous> (/Users/inouetomoyuki/Dropbox/Projects/node/matador_coffee_sample/test/MasamuneModel.test.coffee:12:29)
      at Test.run (/Users/inouetomoyuki/.nvm/v0.6.12/lib/node_modules/mocha/lib/runnable.js:143:15)
      at Runner.runTest (/Users/inouetomoyuki/.nvm/v0.6.12/lib/node_modules/mocha/lib/runner.js:272:10)
      at /Users/inouetomoyuki/.nvm/v0.6.12/lib/node_modules/mocha/lib/runner.js:316:12
      at next (/Users/inouetomoyuki/.nvm/v0.6.12/lib/node_modules/mocha/lib/runner.js:199:14)
      at /Users/inouetomoyuki/.nvm/v0.6.12/lib/node_modules/mocha/lib/runner.js:208:7
      at next (/Users/inouetomoyuki/.nvm/v0.6.12/lib/node_modules/mocha/lib/runner.js:157:23)
      at Array.0 (/Users/inouetomoyuki/.nvm/v0.6.12/lib/node_modules/mocha/lib/runner.js:176:5)
      at EventEmitter._tickCallback (node.js:192:40)

「MasamuneModelがありません」と怒られますので、作ってみます。Matadorのジェネレーターを使って生成してみます。

$ matador model Masamune
generating model Masamune
Successfully created ./app/models/MasamuneModel.js
$ js2coffee app/models/MasamuneModel.js > app/models/MasamuneModel.coffee
$ rm app/models/MasamuneModel.js 

もう一回実行してみます。

$ mocha

  .

  ✔ 1 tests complete (9ms)

テストが通りました。

もう少しだけテストを書いてみましょう。

app = require('matador').createApp __dirname + '/../'
should = require 'should'

describe 'MasamuneModel', ->
  describe '生成', ->
    it '政宗モデルを生成できる', (done) ->
      MasamuneModel = app.getModel('Masamune', true)
      model = new MasamuneModel()
      should.exist model
      done()
  describe '取得', ->
    it '伊達家の歴代を取得する', (done) ->
      MasamuneModel = app.getModel('Masamune', true)
      model = new MasamuneModel()
      model.findAll (err, dateList) ->
        dateList.length.should.eql 1
        dateList.should.eql ['伊達政宗']
        done()

実行してみます。

$ mocha

  ..

  ✖ 1 of 2 tests failed:

  1) MasamuneModel 取得 伊達家の歴代を取得する:
     TypeError: Object #<fn> has no method 'findAll'
      at Context.<anonymous> (/Users/inouetomoyuki/Dropbox/Projects/node/matador_coffee_sample/test/MasamuneModel.test.coffee:23:22)
      at Test.run (/Users/inouetomoyuki/.nvm/v0.6.12/lib/node_modules/mocha/lib/runnable.js:143:15)
      at Runner.runTest (/Users/inouetomoyuki/.nvm/v0.6.12/lib/node_modules/mocha/lib/runner.js:272:10)
      at /Users/inouetomoyuki/.nvm/v0.6.12/lib/node_modules/mocha/lib/runner.js:316:12
      at next (/Users/inouetomoyuki/.nvm/v0.6.12/lib/node_modules/mocha/lib/runner.js:199:14)
      at /Users/inouetomoyuki/.nvm/v0.6.12/lib/node_modules/mocha/lib/runner.js:208:7
      at next (/Users/inouetomoyuki/.nvm/v0.6.12/lib/node_modules/mocha/lib/runner.js:157:23)
      at Array.0 (/Users/inouetomoyuki/.nvm/v0.6.12/lib/node_modules/mocha/lib/runner.js:176:5)
      at EventEmitter._tickCallback (node.js:192:40)

findAllメソッドがないと怒られます。プロダクトコードを修正します。

app/models/MasamuneModel.coffee


module.exports = (app, config) ->
  app.getModel("Application", true).extend().methods({
    findAll:(callback) ->
      callback(null, ['伊達政宗'])
  }) 

テストを実行してみます。

$ mocha

  ..

  ✔ 2 tests complete (7ms)


無事通りました。

こんな感じでやっていけば、何とかなりそうです。テストコード内の1行目「app」の取得方法がかっこ悪いですが。

0 件のコメント: