我有一个场景,我希望在调用回调后在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() ;
})
答案 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块中