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