Je souhaite tester une fonction qui appelle une méthode d'API externe deux fois, en utilisant des paramètres différents. Je voudrais me moquer de cette API externe avec un espion Jasmine et renvoyer des éléments différents en fonction des paramètres. Y a-t-il un moyen de faire ça chez Jasmine? Le mieux que je puisse trouver est un hack utilisant 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;
}
});
});
});
Dans les versions 3.0 et supérieures de Jasmine, vous pouvez utiliser 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);
});
});
Pour les versions de Jasmine antérieures à la version 3.0, callFake
est la bonne solution, mais vous pouvez le simplifier à l'aide d'un objet contenant les valeurs de retour.
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]
});
});
});
Selon la version de Jasmine, la syntaxe est légèrement différente:
.andCallFake(fn)
.and.callFake(fn)
Ressources:
Vous pouvez aussi utiliser $provide
pour créer un espion. Et se moquer en utilisant and.returnValues
au lieu de and.returnValue
pour transmettre les données paramétrées.
Selon Jasmine docs: En enchaînant l'espion avec
and.returnValues
, tous les appels à la fonction renverront des valeurs spécifiques dans l’ordre jusqu’à ce qu’il atteigne la fin de la liste des valeurs de retour. À ce stade, il renverra undéfini pour tous les appels suivants.
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
}));
});