異なるパラメーターを使用して外部APIメソッドを2回呼び出す関数をテストします。この外部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より前のジャスミンバージョンの場合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のバージョンに応じて、構文はわずかに異なります。
.andCallFake(fn)
.and.callFake(fn)
リソース:
$provide
を使用してスパイを作成することもできます。そして、and.returnValues
の代わりにand.returnValue
を使用してモックを作成し、パラメーター化されたデータを渡します。
Jasmine docsによるとスパイを
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
}));
});