我有一个工作ractive组件测试用例已经使用mocha使用sinon ans能够模拟ajax调用但是在setTimeout(function(){}, 100)
的帮助下我不喜欢使用它。
beforeEach(function () {
this.container = document.createElement('div');
document.body.appendChild(this.container);
this.server = sinon.fakeServer.create();
this.server.respondWith(
"GET",
"/api/url",
[
200,
{ "Content-Type": "application/json" },
'{"data": []}'
]
);
});
afterEach(function () {
document.body.removeChild(this.container);
});
it("should fetch data from server", function (done) {
var server = this.server;
var Component = require('rvc!path/to/component');
var component = new Component({
el: this.container,
});
setTimeout( function() {
server.respond();
expect(component.findAll('.list li').length).to.equal(7);
done();
}, 100);
});
正如您在上面的代码中所看到的,我正在使用setTimeout来确保在对组件进行实际测试之前进行了ajax调用(模拟)。
有没有办法可以消除具有相同效果的setTimeout?谢谢!
答案 0 :(得分:3)
假设您的http请求发生在组件中,那么在事件循环的下一个滴答之前它将不会获取数据。
一种方法是使用setTimeout,但你可能可以降低超时(使用autoRespondAfter
来调整sinon响应延迟)。
如果您的组件代码支持它,那么看起来非常适合sinon fakeServer文档中的用例的方法是使用respondImmediately
选项:
如果设置,服务器将立即响应每个请求 同步。这非常适合在测试中伪造服务器 无需在每次请求后调用server.respond() 那个测试。由于这是同步和即时的,这是不合适的 用于模拟测试或模型中的实际网络延迟。
this.server = sinon.fakeServer.create({ respondImmediately: true })
// now no need to call server.respond() and calls are returned synchronously!