4

当回调失败时,我无法弄清楚为什么我的保存回调在我的 mocha 测试中被调用了两次。它不会两次调用保存,它只会再次触发保存的回调,但是当我的第二个单元测试失败时会出现“应该”错误。如果我从第二个测试中取出失败的“应该”断言should.exist err,它似乎工作正常并且不会触发保存索引回调两次。

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

好吧,首先,具有预定义顺序的测试是不好的形式。您的第二个测试应该尝试将两个用户保存到数据库中,而不是依赖于第一个测试。

其次,我只能假设在这种情况下它db是一个 node-neo4j Database,并且您的断言框架(should.js?chai?)正在使用异常。所以我的回答是基于这个假设。

似乎 node-neo4j 正在调用异常情况下的回调函数。

尝试只做 athrow 'blah'而不是should断言,看看是否可以将其缩小到那个范围。这没有在 node-neo4j 文档中列出,所以它看起来像一个错误。

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

于 2013-01-22T18:17:50.253 回答