使用jasmine监视异步函数

时间:2013-07-02 06:34:55

标签: javascript node.js unit-testing jasmine jasmine-node

我正在使用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可以这样吗?

3 个答案:

答案 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);
}