(未解決->解決?)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()
    )
  )

)