测试承诺NodeJS中的回调与Mocha&兴农

时间:2013-09-02 22:08:02

标签: node.js unit-testing mocha sinon

我正在尝试测试一个返回promise的方法调用但是我遇到了麻烦。在NodeJS代码中,我使用Mocha,Chai和Sinon来运行测试。我目前的测试是:

it('should execute promise\'s success callback', function() {
  var successSpy = sinon.spy();

  mySpies.executeQuery = sinon.stub(databaseConnection, 'execute').returns(q.resolve('[{"id":2}]'));

  databaseConnection.execute('SELECT 2 as id FROM Users ORDER BY RAND() LIMIT 1').then(successSpy, function(){});

  chai.expect(successSpy).to.be.calledOnce;

  databaseConnection.execute.restore();
});

但是这个测试错误地用:

AssertionError: expected spy to have been called exactly once, but it was called 0 times

测试返回promise的方法的正确方法是什么?

2 个答案:

答案 0 :(得分:7)

在注册期间不会调用then()调用的处理程序 - 仅在下一个事件循环期间调用,该事件循环位于当前测试堆栈之外。

您必须在完成处理程序中执行检查,并通知mocha您的异步代码已完成。 另请参阅http://visionmedia.github.io/mocha/#asynchronous-code

看起来应该是这样的:

it('should execute promise\'s success callback', function(done) {
  mySpies.executeQuery = sinon.stub(databaseConnection, 'execute').returns(q.resolve('[{"id":2}]'));

  databaseConnection.execute('SELECT 2 as id FROM Users ORDER BY RAND() LIMIT 1').then(function(result){
    chai.expect(result).to.be.equal('[{"id":2}]');
    databaseConnection.execute.restore();
    done();
  }, function(err) {
    done(err);
  });
});

对原始代码的更改:

  • 测试功能的完成参数
  • 在then()处理程序
  • 中检查和清理

编辑:另外,老实说,这个测试没有测试任何关于你的代码的东西,它只是验证了promise的功能,因为代码的唯一位(databaseConnection)被删除了。

答案 1 :(得分:1)

我建议您查看Mocha As Promised

它允许比尝试执行done()和所有废话更清晰的语法。

it('should execute promise\'s success callback', function() {
    var successSpy = sinon.spy();

    mySpies.executeQuery = sinon.stub(databaseConnection, 'execute').returns(q.resolve('[{"id":2}]'));

    // Return the promise that your assertions will wait on
    return databaseConnection.execute('SELECT 2 as id FROM Users ORDER BY RAND() LIMIT 1').then(function() {
        // Your assertions
        expect(result).to.be.equal('[{"id":2}]');
    });

});