说我在监视这样的方法:
spyOn(util, "foo").andReturn(true);
测试中的函数多次调用util.foo
。
是否有可能在第一次调用间谍时返回true
,但第二次返回false
?或者有不同的方法可以解决这个问题吗?
答案 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();
});
});