断言失败,因为它不等待承诺解决

时间:2018-03-30 22:22:16

标签: javascript unit-testing promise sinon stub

我使用mocha,sinon和chai来运行一组测试。这是我正在测试的方法

fn.method().then(function(response) {
  console.log(response)
  test()
})

我已经删除了method这样的

test = sinon.spy()  
fn = { method: sinon.stub().resolves("hello") }

在我的测试中我有

expect(fn.method()).to.have.been.called
console.log("goodbye")
expect(test).to.have.been.called

我希望测试能够按顺序传递并打印“hello”和“goodbye”,但我看到的是expect(test).to.have.been.called失败,而且我发现“hello”在“再见”之后被打印出来了。

在promise解决后调用test的正确方法是什么?

1 个答案:

答案 0 :(得分:1)

这是失败的,因为(大概)在你的两条线上的sinon .resolves钩子中有足够的异步性

console.log("goodbye");
expect(test).to.have.been.called;

在测试方法的.then块中的代码运行之前运行。 (我们知道它正在运行,因为我们看到控制台已被记录,但我们知道它必须在第二行expect行之后运行。)

我会从你的期望中解开你的存根方法,可能是这样的:

// in test.js

fn.method().then(() => {
  expect(test).to.have.been.called;
});