如何为 Jasmine 间谍的多个调用提供不同的返回值
Posted
技术标签:
【中文标题】如何为 Jasmine 间谍的多个调用提供不同的返回值【英文标题】:How to have different return values for multiple calls on a Jasmine spy 【发布时间】:2015-01-09 23:48:54 【问题描述】:假设我在监视这样的方法:
spyOn(util, "foo").andReturn(true);
被测函数多次调用util.foo
。
是否可以让间谍在第一次调用时返回true
,但第二次返回false
?还是有其他方法可以解决这个问题?
【问题讨论】:
【参考方案1】:您可以使用spy.and.returnValues(作为 Jasmine 2.4)。
例如
describe("A spy, when configured to fake a series of return values", function()
beforeEach(function()
spyOn(util, "foo").and.returnValues(true, false);
);
it("when called multiple times returns the requested values in order", function()
expect(util.foo()).toBeTruthy();
expect(util.foo()).toBeFalsy();
expect(util.foo()).toBeUndefined();
);
);
有些事情你必须小心,还有一个函数会类似returnValue
而没有s
,如果你使用它,茉莉花不会警告你。
【讨论】:
+1:这是一个很棒的功能。不过要提醒一句——注意不要忘记.returnValues
中的“s”——这两个函数显然不同,但是将多个参数传递给.returnValue
不会引发错误。我不想承认我因为那个角色浪费了多少时间。
@TheDIMMReaper,谢谢。我现在提到它。
在 beforeEach 中做这件事对我来说很重要,而不是在测试中(它)
当然,在 TypeScript 中使用 jasmine 时无需担心拼写错误。【参考方案2】:
对于 Jasmine 的旧版本,您可以将 spy.andCallFake
用于 Jasmine 1.3 或使用 spy.and.callFake
用于 Jasmine 2.0,并且您必须通过简单的闭包或对象属性来跟踪“调用”状态等。
var alreadyCalled = false;
spyOn(util, "foo").andCallFake(function()
if (alreadyCalled) return false;
alreadyCalled = true;
return true;
);
【讨论】:
我们可以将其扩展为 2 个以上的调用,如下所示: var results = [true, false, "foo"]; var callCount = 0; spyOn(util, "foo").and.callFake(function() return results[callCount++]; ); 这可以扩展为一个通用函数,如下所示: function returnValues() var args = arguments; var callCount = 0; return function() return args[callCount++]; ; 当你可以返回 results.shift() 时为什么要完整这段代码? 我们什么时候返回 observables 这个选项更灵活,我们可以根据调用顺序抛出错误或返回值。以上是关于如何为 Jasmine 间谍的多个调用提供不同的返回值的主要内容,如果未能解决你的问题,请参考以下文章
使用 Jasmine 间谍进行 Angular 2 组件测试“没有 Http 提供者!”错误
使用 Jasmine 在 AngularJS 中测试去抖函数从不调用该函数