如何为 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 间谍?

使用 Jasmine 间谍进行 Angular 2 组件测试“没有 Http 提供者!”错误

使用 Jasmine 在 AngularJS 中测试去抖函数从不调用该函数

如何在茉莉花中重置间谍?

Angular 8:如何为同一组件的多个实例提供不同的服务实例

我们如何为嵌套函数编写单元测试用例(Jasmine)?