Jasmine 스파이에서 여러 호출에 대해 서로 다른 반환 값을 갖는 방법


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전달해도 오류가 발생하지 않습니다. 나는 그 한 캐릭터 때문에 얼마나 많은 시간을 낭비했는지 인정하고 싶지 않습니다.
The DIMM Reaper

@TheDIMMReaper, 감사합니다. 지금 언급합니다.
오션

테스트 (it)가 아니라 나에게 각각 중요했습니다.
Ian

물론 TypeScript에서 jasmine을 사용할 때 철자 오류에 대해 걱정할 필요가 없습니다.
Warlike Chimpanzee

27

이전 버전의 Jasmine의 경우 spy.andCallFakeJasmine 1.3 또는 spy.and.callFakeJasmine 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 () {return results [callCount ++];});
Jack

1
이것은 다음과 같은 일반 함수로 확장 될 수 있습니다. function returnValues ​​() {var args = arguments; var callCount = 0; return function () {return args [callCount ++]; }; }
토마스 Lieberkind

results.shift ()를 반환 할 수 있는데이 코드 전체를 사용하는 이유는 무엇입니까?
ThaFog

우리가 observabvles를 반환 할 때
어떨까요

이 옵션은 호출 순서에 따라 오류를 발생 시키거나 값을 반환 할 수 있으므로 더 유연합니다.
0bj3ct
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.