【问题标题】:How do I stub and spy at the same time我如何同时存根和监视
【发布时间】:2015-06-15 18:47:56
【问题描述】:

所以我正在测试一个调用另一个函数的函数,它返回一个承诺,SUT 看起来像这样:

fn($modal) -> 
    modalInstance = $modal.open({
       controller: 'myCtrl'
       size: 'lg'
     })

    modalInstance.result.then(updateData)

现在如果我需要测试它,我可以从以下内容开始:

it 'when modal called, results get updated with right data', ->

   $modal = {
      open: sinon.stub().returns({ 
          result: $q.when([1, 2, 3]) 
      })
   }

   fn($modal)

然后检查updatedData是否等于[1,2,3]

但我还想确保 $modal.open 已被调用并且正确的参数被传递给它。我该怎么做?

我不仅需要存根方法,还需要监视它,我应该模拟整个$modal 吗?你能帮我正确的语法吗?

当我做这样的事情时:

mMk  = sinon.mock($modal)
mMk.expects('open')

诗乃对我大喊: TypeError: Attempted to wrap open which is already stubbed

【问题讨论】:

    标签: javascript angularjs unit-testing mocha.js sinon


    【解决方案1】:

    Sinon 中的 Stub 支持完整的 spy API,因此您可以执行以下操作:

    // override $modal
    $modal = {
        open: sinon.stub().returns({
            result: $q.when([1, 2, 3])
        });
    };
    
    fn($modal);
    expect($modal.open).toHaveBeenCalledWith(...);
    

    请注意,如果$modal 是一个可注入服务,那么只存根open 方法可能比覆盖整个$modal 更简洁。

    // override $modal.open
    sinon.stub($modal, 'open').returns({
        result: $q.when([1, 2, 3])
    });
    

    【讨论】:

      猜你喜欢
      • 2015-08-09
      • 2019-06-05
      • 1970-01-01
      • 2016-02-08
      • 1970-01-01
      • 1970-01-01
      • 2016-05-17
      • 2019-07-27
      • 2017-01-17
      相关资源
      最近更新 更多