如何在Jasmine间谍上为多个调用设置不同的返回值

时间:2014-11-12 23:25:35

标签: javascript unit-testing jasmine

说我在监视这样的方法:

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

测试中的函数多次调用util.foo

是否有可能在第一次调用间谍时返回true,但第二次返回false?或者有不同的方法可以解决这个问题吗?

3 个答案:

答案 0 :(得分:114)

您可以使用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 :(得分:19)

对于旧版本的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 :(得分:1)

如果您希望为每个电话编写规范,您也可以使用beforeAll而不是beforeEach:

describe("A spy taking a different value in each spec", function() {
  beforeAll(function() {
    spyOn(util, "foo").and.returnValues(true, false);
  });

  it("should be true in the first spec", function() {
    expect(util.foo()).toBeTruthy();
  });

  it("should be false in the second", function() {
    expect(util.foo()).toBeFalsy();
  });
});