다른 매개 변수를 사용하여 외부 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에 지정된 서명 과 동일하면 함수의 내부 기능을 수정할 수 있습니다.