如何对Jasmine间谍的多个调用具有不同的返回值


100

说我正在监视这样的方法:

spyOn(util, "foo").andReturn(true);

被测函数util.foo多次调用。

间谍是否有可能true在第一次调用时返回,而false在第二次返回时呢?还是有其他方法可以做到这一点?

Answers:


163

您可以使用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,如果你使用,茉莉不会报警。


20
+1:这是一项出色的功能。不过要警告一下-注意不要忘记其中的's'- .returnValues这两个函数显然是不同的,但是将多个参数传递给.returnValue不会引发错误。我不想承认我因为那个角色而浪费了多少时间。
DIMM收割机

@TheDIMMReaper,谢谢。我现在提。
2016年

在之前做它对我来说很重要,而不是在测试中(it)
Ian

当然,在TypeScript中使用茉莉花时,无需担心拼写错误。
好战的黑猩猩

27

对于较旧版本的Jasmine,您可以将其spy.andCallFake用于Jasmine 1.3或spy.and.callFakeJasmine 2.0,并且必须通过简单的闭包或对象属性等来跟踪“被调用”状态。

var alreadyCalled = false;
spyOn(util, "foo").andCallFake(function() {
    if (alreadyCalled) return false;
    alreadyCalled = true;
    return true;
});

4
我们可以将其扩展为两个以上的调用,如下所示:var results = [true,false,“ foo”]; var callCount = 0; spyOn(util,“ foo”)。and.callFake(function(){return results [callCount ++];});
杰克

1
可以将其扩展为通用函数,如下所示:function returnValues(){var args = arguments; var callCount = 0; return function(){return args [callCount ++]; }; }
Tomas Lieberkind '16

当您只返回result.shift()时,为什么还要整段代码?
ThaFog

何时返回观测

此选项更加灵活,因为我们可以根据调用顺序抛出错误或返回值。
0bj3ct
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.