用jasmine监听asynchronous函数

我正在使用茉莉花节点来testing我的服务器。 我想伪造/绕过我的用户类中的一些validation相关的代码。 所以我会设置一个这样的间谍 –

var user = { email: 'email@email.com', password: 'password' } spyOn(User, 'validateFields').andReturn(user); 

但是validateFields函数是asynchronous的…

 User.prototype.validateFields = function(user, callback) { // validate the user fields callback(err, validatedUser); } 

所以我实际上会需要这样的一个callback而不是回报 –

 var user = { email: 'email@email.com', password: 'password' } spyOn(User, 'validateFields').andCallback(null, user); 

茉莉花是可以做到的吗?

有两种方法。 首先你可以间谍,然后得到间谍的第一个电话的参数,并用你的模拟数据调用这个函数:

 spyOn(User, 'validateFields') //run your code User.validateFields.mostRecentCall.args[1](errorMock, userMock) 

另一种方法是使用sinonJS 存根 。

 sinon.stub(User, 'validateFields').callsArgWith(1, errorMock, userMock); 

这将立即调用模拟数据的callback函数。

你可以传递一个callback函数,并询问这个函数是否被调用。

对不起,以asynchronous响应4年的延迟,但我一直只是想知道如何解决类似的问题,并认为我可以结合茉莉花donecallback和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); }