(未解決->解決?)Node + MongoDB + Mocha
表題とおりの環境で開発中(趣味)なのだけれど,ドハマりして今日は一日費してまるで進捗ダメでした.
TDD
もともとはNode + MongoDBだけでやろうといういうところだったけれど,いい子さんなのでちゃんとテスト書こうと思って書き始めたらハマりました.
まあ,つまりはテストコードの方に問題がありそうというところなんだけど,,,言い訳ですが今までテスト駆動文化のない社会に育ってきたので,しかしながらOSS的な活動もしたいと思い,プライベートではテストを組み込んでいこうとしているところなのです.
なにが言いたいかというとノウハウがないです...
テスト駆動開発するにあたって,APIのインターフェースどうしようかとか考えつつコーディングしてました.その設計(コーディング含む)とかの一環で壊したかどうかでドハマりしました.
未解決 -> 解決?
現時点解決したのかどうか... とりあえずテストはパスしたのですけど,あまり納得がいってなくて,MongoDBドキュメント(レコード)追加のために配列でテストデータを用意したのですけど,ループでやるとダメで,itをドキュメント数分行うとキレイにパスします. こういったテストはどうするのでしょう? アドバイスを頂けたら幸いです.
追記 03/14 20:38) TDDが設計のためのテストコーディングだったらこういうテストは書かない方が普通なのかな? 引き続きアドバイス頂きたいです.
環境をさらに詳しく書くと次になります. Node + MongoDB + mongoose + Mocha + Chai(BDD) + CoffeeScript
ループ版のテスト
mongoose = require('mongoose') expect = require('chai').expect Users = require('./user').Users User = require('./user').User describe('User DB and Class Test', -> before((done) -> mongoose.connect('mongodb://localhost/shoutbox') done() ) after((done) -> mongoose.disconnect() done() ) expectUsers = [ { name: 'taro', password: 'taro_password', product: null } { name: 'jiro', password: 'jiro_password', product: null } ] it('test', (done) -> for user, i in expectUsers newUser = new User(user.name, {}) newUser.save({}, do (user) -> return (err, product) -> done(err) if err console.dir(user) console.dir(product) user.product = product expect(user.name).to.be.equal(product.name) ) # (1) done() を有効にするとテストはパスするが, # ドキュメント(レコード)が追加されない!!! # (2) done() を無効にするとレコードが追加されるが, # タイムアウトで失敗する #done() ) )
itがドキュメント数分のテスト
mongoose = require('mongoose') expect = require('chai').expect Users = require('./user').Users User = require('./user').User describe('User DB and Class Test', -> index = 0 before((done) -> mongoose.connect('mongodb://localhost/shoutbox') done() ) afterEach( -> index++ ) after((done) -> mongoose.disconnect() done() ) expectUsers = [ { name: 'taro', password: 'taro_password', product: null } { name: 'jiro', password: 'jiro_password', product: null } ] it("test - #{expectUsers[index]}", (done) -> testdata = expectUsers[index] newUser = new User(testdata.name, {}) newUser.save({}, do (testdata) -> return (err, product) -> done(err) if err console.dir(testdata) console.dir(product) testdata.product = product expect(testdata.name).to.be.equal(product.name) done() ) ) it("test - #{expectUsers[index]}", (done) -> testdata = expectUsers[index] newUser = new User(testdata.name, {}) newUser.save({}, do (testdata) -> return (err, product) -> done(err) if err console.dir(testdata) console.dir(product) testdata.product = product expect(testdata.name).to.be.equal(product.name) done() ) ) )