我正在使用jasmine 2.0进行测试,我正在监视jquery ajax并返回一个promise。 在done()函数方法中,不会调用displayContent(),但会显示上面的控制台消息。我哪里错了?
test.js
it(..., function() {
var data = {"name" : "John Doe"};
spyOn($, 'ajax').and.callFake(function (req) {
var d = $.Deferred();
d.resolve(data);
return d.promise();
});
app.doSomething();
expect(app.doSomething).toHaveBeenCalled();
})
app.js
app.getData = function() {
var jsonData = app.loadEmpData(); //gets replaced by spy and returns resolve(data);
jsonData.done(function(data) {
console.log("shows up in the console");
app.displayContent(data); // doesn't get called
});
jsonData.fail(function(){
console.log("error loading data");
});
}
app.loadEmpData = function() {
return $.getJSON("/employee.json");
}
app.displayContent = function() {
console.log("some content");
}
app.doSomething = function() {
app.getData();
}
答案 0 :(得分:2)
我脑子里浮现出两种可能的选择:
1)在某些情况下,您应该在测试代码中调用$ scope.apply()以确保执行承诺的函数。
2)您可以使用done()函数,如下所示:
it('', function(done){
$promise.then(function(){
expect(...);
done();
})
});
答案 1 :(得分:1)
监视displayContent()
并检查是否已被调用。
我修改了你的测试并调用了displayContent()
。
替换为此代码并检查。
it("some test", function() {
var data = {"name" : "John Doe"};
spyOn($, 'ajax').and.callFake(function (req) {
var d = $.Deferred();
d.resolve(data);
return d.promise();
});
spyOn(app, 'displayContent').and.callThrough();
app.getData();
expect(app.displayContent).toHaveBeenCalled();
});
在Jasmine 2.0中and.callThrough();
将委托displayContent()
的实际实施。