Обратный вызов вызывается дважды, когда мой модульный тест не пройден

Я не могу понять, почему мой обратный вызов save вызывается дважды в моем тесте mocha, когда обратный вызов не удался. Он не вызывает сохранение дважды, он только вызывает обратный вызов для сохранения снова, но с ошибкой "следует", когда мой 2-й модульный тест не пройден. Если я уберу несостоятельное утверждение "должен" 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)

1 ответ

Решение

Ну, во-первых, наличие тестов с заранее заданным порядком - плохая форма. Ваш второй тест должен попытаться сохранить двух пользователей в базе данных, а не полагаться на первый тест.

Во-вторых, я могу только предположить, что db это узел-neo4j Database в этом контексте и что ваша структура утверждений (should.js? chai?) использует исключения. Так что мой ответ основан на этом предположении.

Кажется, что node-neo4j вызывает функцию обратного вызова в случае исключения.

Попробуйте просто сделать throw 'blah' вместо should утверждение, чтобы увидеть, если вы можете сузить это к этому. Это не указано в документации по node-neo4j, поэтому похоже на ошибку.

Смотрите: http://coffeedoc.info/github/thingdom/node-neo4j/master/classes/Node.html

Другие вопросы по тегам