3

我正在使用 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);

茉莉花有可能发生这样的事情吗?

4

3 回答 3

2

有两种方法。首先,您可以进行 spy,然后获取第一次调用 spy 的参数,并使用您的模拟数据调用此函数:

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

另一种方法是使用 sinonJS stubs

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

这将立即使用模拟数据调用回调函数。

于 2013-07-02T08:07:14.207 回答
0

您可以传入一个回调函数并询问该函数是否已被调用。

于 2013-07-02T06:47:16.180 回答
0

很抱歉以 4 年的异步延迟响应,但我一直想知道如何解决类似的问题,并发现我可以结合 jasminedone回调和and.callFakespy 方法。考虑下面的抽象样本:

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);
}
于 2017-08-28T17:22:47.610 回答