Як отримати різні значення повернення для кількох дзвінків на шпигуна Жасмина


100

Скажімо, я шпигую за таким методом:

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

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

Чи можливо, щоб шпигун повернувся trueвперше, коли його викликали, але повернувся falseвдруге? Або існує інший спосіб зробити це?

Відповіді:


163

Ви можете використовувати 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, якщо ви це використовуєте, жасмин вас не попередить.


20
+1: це відмінна функція. Слово попередження, однак - будьте обережні, щоб не забути символи 's' .returnValues- дві функції, очевидно, різні, але передача кількох аргументів .returnValueне викликає помилки. Я не хочу визнати, скільки часу я втратив завдяки цьому одному персонажу.
Жниварка DIMM

@TheDIMMReaper, дякую. Я згадую це зараз.
Океан

Робити це раніше, перед кожним було важливим для мене, а не в тесті (це)
Ян

Звичайно, не потрібно турбуватися про орфографічні помилки при використанні жасмину в TypeScript.
Войовниче шимпанзе

27

Для старих версій 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;
});

4
Ми можемо продовжити це для більш ніж 2 дзвінків, наприклад: var results = [true, false, "foo"]; var callCount = 0; spyOn (util, "foo"). and.callFake (function () {повернути результати [callCount ++];});
Джек,

1
Це може бути розширено до загальної функції таким чином: function returnValues ​​() {var args = аргументи; var callCount = 0; функція повернення () {повернення аргументів [callCount ++]; }; }
Томас Ліберкінд

Навіщо цілий цей код, коли ви можете просто повернути results.shift ()?
ThaFog

як про те, коли ми повертаємося observabvles
Lijo

ця опція є більш гнучкою, оскільки ми можемо видавати помилку або повертати значення залежно від порядку виклику.
0bj3ct
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.