【问题标题】:Spying on asynchronous functions with jasmine用茉莉花监视异步函数
【发布时间】:2013-06-29 10:14:14
【问题描述】:

我正在使用 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 能做到这样吗?

【问题讨论】:

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


    【解决方案1】:

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

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

    【讨论】:

      【解决方案2】:

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

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

      另一种方法是使用 sinonJS stubs

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

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

      【讨论】:

        【解决方案3】:

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

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2018-01-23
          • 2018-08-12
          • 2011-10-01
          • 2014-12-12
          • 2023-03-26
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多