我熟悉了Jasmine(http://pivotal.github.com/jasmine/)并发现了一些令人困惑的事情:
it("should be able to send a Ghost Request", function() {
var api = fm.api_wrapper;
api.sendGhostRequest(function(response) {
console.dir('server says: ', response);
});
expect(true).toEqual(false);
});
按预期失败。
但是,在回调中移动expect调用:
it("should be able to send a Ghost Request", function() {
var api = fm.api_wrapper;
api.sendGhostRequest(function(response) {
console.dir('server says: ', response);
expect(true).toEqual(false);
});
});
以某种方式通过:O
经过一些调试: api.sendGhostRequest()执行异步ajax请求,jasmine在请求完成之前冲过去。
因此问题:
如何在确定测试结果之前让茉莉花等待ajax执行?
答案 0 :(得分:14)
编辑Jasmine 2
异步测试在Jasmine 2中变得更加简单。任何需要处理异步代码的测试都可以使用回调编写,这将指示测试的完成。请参阅标题异步支持
下的Jasmine 2 docsit('should be able to send a ghost request', (done) => {
api.sendGhostRequest((response) => {
console.log(`Server says ${response}`);
expect(true).toEqual(false);
done();
});
});
Jasmine 1
在标题异步支持下的Jasmine site上查看 waitsFor()和运行()。
使用run和waititsfor会强制Jasmine等待ajax调用完成或暂停。
代码如下:
it("should be able to send a Ghost Request", function() {
runs(function() {
api.sendGhostRequest(function(response) {
console.dir('server says: ', response);
flag = true;
});
}, 500);
waitsFor(function() {
return flag;
}, "Flag should be set", 750);
runs(function() {
expect(true).toEqual(false);
});
}
在这种情况下,期望会失败。
答案 1 :(得分:4)
正如@pkopac所评论的那样,{v}赞成使用runs()
回调,而https://jasmine.github.io/2.0/introduction.html#section-Asynchronous_Support
waitsFor()
和done()
it("should be able to send a Ghost Request", function(done) {
var api = fm.api_wrapper;
var success = function(response) {
console.dir('server says: ', response);
expect(response).toEqual('test response')
done();
};
api.sendGhostRequest(success);
});
答案 2 :(得分:1)
查看runs()和waitfor()
具体来说,您可以调用waitfor来检查回调是否以某种方式运行(可能使用布尔值作为检查?)然后运行期望。
运行允许您等到waitfor完成。