programing

주장을 바탕으로 재스민 스파이를 수정할 수 있는 방법이 있습니까?

telebox 2023. 9. 9. 09:28
반응형

주장을 바탕으로 재스민 스파이를 수정할 수 있는 방법이 있습니까?

다른 파라미터를 이용하여 외부 API 방식을 두 번 호출하는 것을 테스트해보고 싶은 기능이 있습니다.재스민 스파이와 함께 이 외부 API를 조롱하고 파라미터에 따라 다른 것을 돌려주고 싶습니다.재스민에서 이것을 할 수 있는 방법이 있습니까?제가 생각할 수 있는 최선의 방법은 해킹과 CallFake:

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

Jasmine 3.0 이전 버전의 경우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');
}

제 사양에 따르면 테스트베드에서 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에 지정된 것과 동일하다면 내부적으로 수행하는 기능을 수정할 수 있습니다.

언급URL : https://stackoverflow.com/questions/16198353/any-way-to-modify-jasmine-spies-based-on-arguments

반응형