Подтвердить что ты не робот

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

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

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

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

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

4b9b3361

Ответ 1

Вы можете использовать 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();
  });
});

Ответ 2

Для более старых версий Jasmine вы можете использовать spy.andCallFake для Jasmine 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;
});

Ответ 3

Если вы хотите написать спецификацию для каждого вызова, вы также можете использовать 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();
  });
});