Как иметь разные возвращаемые значения для нескольких вызовов на шпионе Jasmine


скажем, я шпионил за таким методом:

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

тестируемая функция вызывает util.foo несколько раз.

возможно ли вернуть шпиона true в первый раз это называется, но вернуться false второй раз? Или есть другой способ сделать это?

3 54

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();
  });
});