[javascript] 인수를 기반으로 재스민 스파이를 수정하는 방법은 무엇입니까?

다른 매개 변수를 사용하여 외부 API 메서드를 두 번 호출하는 테스트하려는 함수가 있습니다. Jasmine 스파이 로이 외부 API를 조롱하고 매개 변수에 따라 다른 것을 반환하고 싶습니다. Jasmine에서 이것을 할 수있는 방법이 있습니까? 내가 생각해 낼 수있는 최선은 andCallFake를 사용하는 해킹입니다.

var functionToTest = function() {
  var userName = externalApi.get('abc');
  var userId = externalApi.get('123');
};


describe('my fn', function() {
  it('gets user name and ID', function() {
    spyOn(externalApi, 'get').andCallFake(function(myParam) {
      if (myParam == 'abc') {
        return 'Jane';
      } else if (myParam == '123') {
        return 98765;
      }
    });
  });
});



답변

Jasmine 버전 3.0 이상에서는 withArgs

describe('my fn', function() {
  it('gets user name and ID', function() {
    spyOn(externalApi, 'get')
      .withArgs('abc').and.returnValue('Jane')
      .withArgs('123').and.returnValue(98765);
  });
});

3.0 이전의 Jasmine 버전 callFake은 올바른 방법이지만 객체를 사용하여 반환 값을 유지하여 단순화 할 수 있습니다

describe('my fn', function() {
  var params = {
    'abc': 'Jane',
    '123': 98765
  }

  it('gets user name and ID', function() {
    spyOn(externalApi, 'get').and.callFake(function(myParam) {
     return params[myParam]
    });
  });
});

Jasmine 버전에 따라 구문이 약간 다릅니다.

  • 1.3.1 : .andCallFake(fn)
  • 2.0 : .and.callFake(fn)

자원:


답변

$provide스파이를 만드는 데 사용할 수도 있습니다 . 그리고 매개 변수가 지정된 데이터를 전달 하는 and.returnValues대신 사용하여 조롱하십시오 and.returnValue.

Jasmine 문서에 따르면 : 스파이를로 연결하면 and.returnValues함수에 대한 모든 호출은 반환 값 목록의 끝에 도달 할 때까지 특정 값을 순서대로 반환하며,이 시점에서 이후의 모든 호출에 대해 정의되지 않은 값이 반환됩니다.

describe('my fn', () => {
    beforeEach(module($provide => {
        $provide.value('externalApi', jasmine.createSpyObj('externalApi', ['get']));
    }));

        it('get userName and Id', inject((externalApi) => {
            // Given
            externalApi.get.and.returnValues('abc','123');

            // When
            //insert your condition

            // Then
            // insert the expectation                
        }));
});


답변

필자의 경우 테스트 할 구성 요소가 있었고 생성자에는 다른 인수로 매번 두 번 호출되는 getAppConfigValue 라는 메소드가있는 구성 서비스가 있습니다 .

constructor(private configSvc: ConfigService) {
  this.configSvc.getAppConfigValue('a_string');
  this.configSvc.getAppConfigValue('another_string');
}

내 사양에서는 TestBed에서 다음과 같이 ConfigService를 제공했습니다.

{
  provide: ConfigService,
  useValue: {
    getAppConfigValue: (key: any): any {
      if (key === 'a_string) {
        return 'a_value';
      } else if (key === 'another_string') {
        return 'another_value';
      }
    }
  } as ConfigService
}

따라서 getAppConfigValue 의 서명 이 실제 ConfigService에 지정된 서명 과 동일하면 함수의 내부 기능을 수정할 수 있습니다.


답변