Eu tenho uma função que eu gostaria de testar, que chama um método de API externo duas vezes, usando parâmetros diferentes. Gostaria de zombar dessa API externa com um espião Jasmine e retornar coisas diferentes com base nos parâmetros. Existe alguma maneira de fazer isso em Jasmine? O melhor que posso apresentar é um hack usando o 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;
}
});
});
});
and.callFake
- jasmine.github.io/2.2/… >spyOn(fake, 'method').withArgs('abc').and.returnValue('Jane')
espyOn(fake, 'method').withArgs('123').and.returnValue(98765)
..withArgs
não está funcionando para mim em jasmim 2.0.withArgs
não está realmente disponível - eu quis dizer que esse método faria sentido ao escrever testes.Você também pode usar
$provide
para criar um espião. E simule usando emand.returnValues
vez deand.returnValue
passar dados parametrizados.fonte
returnValues
para suportar várias chamadasexternalApi.get.and.returnValues('abc','123')
é chamado dentro dait
função. Caso contrário, se você definir uma lista de valores, caso contrário, nunca funcionará porque a ordem na qual os testes são executados não é previsível. De fato, os testes não devem depender da ordem em que são executados.No meu caso, eu tinha um componente que estava testando e, em seu construtor, há um serviço de configuração com um método chamado getAppConfigValue chamado duas vezes, sempre com argumentos diferentes:
Na minha especificação, eu forneci o ConfigService no TestBed da seguinte forma:
Portanto, desde que a assinatura de getAppConfigValue seja a mesma especificada no ConfigService real, o que a função faz internamente pode ser modificado.
fonte