我有一个jquery ajax调用看起来像这样:
$.ajax({
type: "GET",
dataType: 'json',
data: data,
url: url
}).then((data, successFlag, xhr) => {
this.props.someFunc(data)
})
在我的测试文件中,我使用了sinon的jquery ajax调用,它返回一个已解析的数据承诺:
sinon.stub($, 'ajax')
.returns(Promise.resolve({ data: 'test data' }))
我也在监视我的someFunc(数据)功能。在我的测试中,我调用了一个进行ajax调用的函数,然后期望调用我的someFunc(数据)。但是,期望失败,但是当我在我的someFunc(数据)函数中放入控制台日志时,我可以看到它显然被调用:
component.instance().makeAjaxCall()
expect($.ajax.calledOnce).to.be.true // passes
expect(someFuncSpy.calledOnce).to.be.true // fails
现在我认为它失败了,因为它在那之前检查了期望。然后执行,我尝试查找一些处理承诺测试的解决方案,但到目前为止我没有尝试过任何工作(或者我实施错了)。在检查期望之前,如何确保.then完成执行?
答案 0 :(得分:0)
您应该在ajax Promise上“注册”,并将您的期望放在then
区块中。
类似的东西,
component.instance().makeAjaxCall().then(() => {
expect($.ajax.calledOnce).to.be.true;
expect(someFuncSpy.calledOnce).to.be.true;
});
它不适合你,因为Promise在微任务队列上注册了一个回调,并且它在下一个滴答中运行。
答案 1 :(得分:0)
输入sinon的优秀模拟工具sinon.createFakeServer();
(http://sinonjs.org/releases/v4.1.2/fake-xhr-and-server/)
为测试设置模拟和假服务器,调用该函数,告诉假服务器响应,然后检查期望。
在这种情况下,例如:
it('should call someFunc with the expected data', function () {
var server = sinon.createFakeServer();
server.respondWith("GET", "*",
[200, { "Content-Type": "application/json" },
'[{ "id": 12, "comment": "Hey there" }]']);
var comp = component.instance();
var testStub = sinon.stub(comp.props, 'someFunc');
comp.makeAjaxCall();
this.server.respond();
expect(testStub.calledOnce).to.be.true; // You should consider the sinon-chai package for nicer assertion debugging
testStub.restore();
server.restore();
}
就个人而言,我喜欢能够传入模拟的依赖项,因为我发现它更可测试(例如,将$ .ajax传递给构造函数,存储为实例上的ajaxService参数)。
答案 2 :(得分:0)
在调用存根方法后使用 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;
});
注意:请在函数中将完成作为参数传递给它-((),函数(完成) {})