Jasmine spies callThrough和callFake

时间:2014-07-28 14:10:51

标签: javascript angularjs jasmine

我有一个场景,我希望在调用回调后在done()上调用beforeEach

我尝试按如下方式执行此操作:

spyOn(scope, 'onAdmin').and.callThrough().and.callFake(function(){done()})

但我不确定我是否得到了正确的行为。基本上我想要实现的是能够在每次回调完成之后调用done()

更新:解决方法

scope.onAdminBackup = scope.onAdmin;
spyOn(scope, 'onAdmin').and.callFake(function(admin)  {

 scope.onAdminBackup();
 done() ;

})  

3 个答案:

答案 0 :(得分:3)

我从来没有将这些功能链接在一起,因为在我看来他们似乎正好相反。你说当我调用这个方法-onAdmin时 - 在范围内调用它是正常的。这是callShrough方法茉莉为我们提供的方法。

但是那时你正在使用callFake方法进行链接,所以你说但实际上并没有调用它来调用这个假函数 - 非常矛盾。

如果你想在方法onAdmin上调用spy而不是它被激活,你想要它做一些其他事情 - 一些模拟 - 然后使用.and.callFake(fn)。还要考虑上面的@stefan说 - 不要调用函数 - callFake只是想要一个函数作为参数,它将负责调用它本身。

如果没有向我们展示更多代码,这可能更符合您的要求。

spyOn(scope, 'onAdmin')and.callFake(done)

答案 1 :(得分:2)

当你写完()时,你正在立即调用 尝试将done作为值传递:

spyOn(scope, 'onAdmin').and.callThrough().and.callFake(done)

答案 2 :(得分:0)

我找到了解决此问题的方法。 Jasmine有一个名为addSpyStategy的方法,您可以在其中添加自定义策略,例如callThrough或callFake。看起来像这样:

jasmine.addSpyStrategy('callThroughAndThen', (spy, fn) => {
  return () => {
    spy.and.callThrough();
    setTimeout(() => fn(), 0);
  }
});

在执行自定义函数之前,超时确保实函数完成。然后,对于您的间谍,您可以执行以下操作:

const spy = spyOn(scope, 'onAdmin')
 spy.and.callThroughAndThen(spy, () => {
  // your custom callback
  done();
});

注意:确保将自定义策略放在beforeEach块中