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)
..withArgs
no funciona para mí en jazmín 2.0.withArgs
no está realmente disponible; quise decir que tal método tendría sentido al escribir pruebas.También puedes usar
$provide
para crear un espía. Y simula usar usando enand.returnValues
lugar deand.returnValue
pasar datos parametrizados.fuente
returnValues
para admitir varias llamadasexternalApi.get.and.returnValues('abc','123')
se llama dentro de lait
funció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