我正在使用jasmine-node来测试我的服务器。我想在我的用户类中伪造/绕过一些与验证相关的代码。所以我会建立一个这样的间谍 -
var user = {
email: 'email@email.com',
password: 'password'
}
spyOn(User, 'validateFields').andReturn(user);
然而,validateFields函数是异步的......
User.prototype.validateFields = function(user, callback) {
// validate the user fields
callback(err, validatedUser);
}
所以我实际上需要这样的东西来假装回调而不是返回 -
var user = {
email: 'email@email.com',
password: 'password'
}
spyOn(User, 'validateFields').andCallback(null, user);
Jasmine可以这样吗?
答案 0 :(得分:2)
这有两种方法。首先你可以窥探,然后获得第一次调用间谍的args并使用你的模拟数据调用thisfunction:
spyOn(User, 'validateFields')
//run your code
User.validateFields.mostRecentCall.args[1](errorMock, userMock)
另一种方法是使用sinonJS stubs。
sinon.stub(User, 'validateFields').callsArgWith(1, errorMock, userMock);
这将立即使用模拟数据调用回调函数。
答案 1 :(得分:0)
您可以传入回调函数并询问是否已调用此函数。
答案 2 :(得分:-1)
很抱歉回复4年的异步延迟,但我一直想知道如何解决类似的问题,并想出我可以结合使用jasmine done
回调和and.callFake
间谍方法。考虑下面的抽象示例:
describe('The delayed callback function', function(){
it('should be asynchronously called',function(done){
var mock = jasmine.createSpy('mock');
mock.and.callFake(function(){
expect(mock).toHaveBeenCalled();
done();
});
delayed(mock);
});
});
function delayed(callback){
setTimeout(function(){
callback();
},2000);
}