주장을 바탕으로 재스민 스파이를 수정할 수 있는 방법이 있습니까?
다른 파라미터를 이용하여 외부 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
'programing' 카테고리의 다른 글
PHP에 튜플이 있습니까? (0) | 2023.09.14 |
---|---|
부트스트랩의 '팝오버' 컨테이너에 클래스를 동적으로 추가 (0) | 2023.09.14 |
각도 2 - 드롭다운 목록에서 선택한 값 설정 (0) | 2023.09.09 |
Rxjs to Promise()가 더 이상 사용되지 않습니다. (0) | 2023.09.09 |
SQL Server에서 Oracle로 데이터 반복 이동 (0) | 2023.09.09 |