我有一个 jquery ajax 调用,看起来像这样:
$.ajax({
type: "GET",
dataType: 'json',
data: data,
url: url
}).then((data, successFlag, xhr) => {
this.props.someFunc(data)
})
在我的测试文件中,我用 sinon 删除了 jquery ajax 调用,它返回了一个已解决的 promise 数据:
sinon.stub($, 'ajax')
.returns(Promise.resolve({ data: 'test data' }))
而且我也在监视我的 someFunc(data) 函数。在我的测试中,我正在调用一个进行 ajax 调用的函数,然后期望我的 someFunc(data) 被调用。然而,期望失败了,但是当我在我的 someFunc(data) 函数中放置一个控制台日志时,我可以看到它显然被调用了:
component.instance().makeAjaxCall()
expect($.ajax.calledOnce).to.be.true // passes
expect(someFuncSpy.calledOnce).to.be.true // fails
现在我假设它失败了,因为它在 then .then 执行之前检查期望,我尝试查找一些处理 promises 测试的解决方案,但到目前为止我没有尝试过(或者我实现错误)。如何确保 .then 在我检查期望值之前完成执行?
最佳答案
调用 stub 方法后使用done()。
it('should make an ajax call', function(done) {
sinon.stub($, 'ajax').returns(Promise.resolve({ data: 'test data' }))
component.instance().makeAjaxCall()
expect($.ajax.calledOnce).to.be.true;
done(); // let Mocha know we're done async testing
expect(someFuncSpy.calledOnce).to.be.true;
});
Note: Please pass done as argument in function -- it('', function(done) {})
关于javascript - Mocha 测试用 .then stub 了 ajax 调用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45864385/