4

コールバックが失敗したときに、モカ テストで保存コールバックが 2 回呼び出される理由がわかりません。保存を2回呼び出すのではなく、保存のコールバックを再度起動するだけですが、2番目の単体テストが失敗したときに「すべき」エラーが発生します。失敗した 'should' アサーションshould.exist errを 2 番目のテストから取り出すと、正常に動作しているように見え、インデックスの保存コールバックが 2 回トリガーされることはありません。

class User

  constructor : (@name, @email, @pwd) ->
  save : (callback) ->
    unless this.validate()
      throw new Error('invalid data')
    else
      user = 
        name  : @name
        email : @email
        pwd   : @pwd

      node = db.createNode user

      node.save (err) ->
        unless err        
          user.id = node.id;
          node.index 'User', 'name', user.name.toLowerCase(), (err2) ->
            #why is this being fired twice when an assert in the callback fail?
            console.log '----------- triggering the save callback'
            callback err2, user

        else
          callback err

モカテスト

describe "User", ->
    it "should be able to save", (done) ->
        user = new User("quark", "quark@ds9.com", "profit")
        user.save (err, result) ->
            should.exist result
            done err

    #this second unit test should fail since the duplicate checking is not yet implemented
    it "should not allow duplicates to be saved", (done) ->
        user = new User("quark", "quark@ds9.com", "profit")
        user.save (err, result) ->
            console.log err
            should.exist err #this triggers the user.save callback to be fired twice
            done null

そして検査結果は

  User
    ◦ should be able to save: ----------- triggering the save callback
    ✓ should be able to save (43ms)
    ◦ should not allow duplicates to be saved: ----------- triggering the save callback
undefined
----------- triggering the save callback
{ name: 'AssertionError',
  message: 'expected undefined to exist',
  actual: undefined,
  expected: undefined,
  operator: undefined }
    ✓ should not allow duplicates to be saved 


  ✔ 2 tests complete (69ms)
4

1 に答える 1

1

まず、事前定義された順序を持つテストを使用するのは不適切です。2 番目のテストでは、最初のテストに頼るのではなく、データベースに 2 人のユーザーを保存することを試みる必要があります。

第二に、これはこのコンテキストでdbは node-neo4jDatabaseであり、アサーション フレームワーク (should.js? chai?) が例外を使用しているとしか思えません。だから私の答えはその仮定に基づいています。

node-neo4j は例外の場合にコールバック関数を呼び出しているようです。

throw 'blah'アサーションの代わりに a を実行shouldして、それに絞り込めるかどうかを確認してください。これは node-neo4j のドキュメントには記載されていないため、バグのようです。

参照: http://coffeedoc.info/github/thingdom/node-neo4j/master/classes/Node.html#save-instance

于 2013-01-22T18:17:50.253 に答える