Как иметь разные возвращаемые значения для нескольких вызовов на шпионе Jasmine
скажем, я шпионил за таким методом:
spyOn(util, "foo").andReturn(true);
тестируемая функция вызывает util.foo
несколько раз.
возможно ли вернуть шпиона true
в первый раз это называется, но вернуться false
второй раз? Или есть другой способ сделать это?
3 ответа:
можно использовать шпион.и.returnValues (как Жасмин 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
, Если вы используете это, Жасмин не предупредит вас.
для более старых версий Жасмин, вы можете использовать
spy.andCallFake
Жасмин 1.3 илиspy.and.callFake
для Jasmine 2.0, и вам придется отслеживать состояние "called", либо через простое закрытие, либо свойство объекта и т. д.var alreadyCalled = false; spyOn(util, "foo").andCallFake(function() { if (alreadyCalled) return false; alreadyCalled = true; return true; });
Если вы хотите написать спецификацию для каждого вызова, вы также можете использовать 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(); }); });