Tengo una función que me gustaría probar que llama a un método API externo dos veces, usando diferentes parámetros. Me gustaría burlarme de esta API externa con un espía Jasmine, y devolver diferentes cosas según los parámetros. ¿Hay alguna manera de hacer esto en Jasmine? Lo mejor que puedo encontrar es un hack usando 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')yspyOn(fake, 'method').withArgs('123').and.returnValue(98765)..withArgsno funciona para mí en jazmín 2.0.withArgsno está realmente disponible; quise decir que tal método tendría sentido al escribir pruebas.También puedes usar
$providepara crear un espía. Y simula usar usando enand.returnValueslugar deand.returnValuepasar datos parametrizados.fuente
returnValuespara admitir varias llamadasexternalApi.get.and.returnValues('abc','123')se llama dentro de laitfunción. De lo contrario, si establece una lista de valores, de lo contrario, nunca funcionará porque el orden en que se ejecutan las pruebas no es predecible. De hecho, las pruebas no deberían depender del orden en que se ejecutan.En mi caso, tenía un componente que estaba probando y, en su constructor, hay un servicio de configuración con un método llamado getAppConfigValue que se llama dos veces, cada vez con diferentes argumentos:
En mi especificación, proporcioné el ConfigService en TestBed de la siguiente manera:
Por lo tanto, siempre que la firma de getAppConfigValue sea la misma que la especificada en el ConfigService real, lo que hace la función internamente puede modificarse.
fuente