javascript - test - ¿Alguna forma de modificar a los espías de Jasmine en base a argumentos?
nodejs test (2)
También podría usar $provide
para crear un espía. Y and.returnValues
uso de and.returnValues
lugar de and.returnValue
para pasar los datos parametrizados.
Según los documentos de Jasmine: encadenando el espía con
and.returnValues
, todas las llamadas a la función devolverán valores específicos en orden hasta que llegue al final de la lista de valores de retorno, en cuyo punto volverá a ser indefinido para todas las llamadas posteriores.
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
}));
});
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 burlar esta API externa con un espía de Jasmine y devolver cosas diferentes según los parámetros. ¿Hay alguna forma de hacer esto en Jasmine? Lo mejor que se me ocurre es un truco 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;
}
});
});
});
callFake
es el camino correcto, pero puedes simplificarlo usando un objeto para mantener los valores de retorno
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]
});
});
});
Dependiendo de la versión de Jasmine, la sintaxis es ligeramente diferente:
- 1.3.1:
.andCallFake(fn)
- 2.0:
.and.callFake(fn)
Recursos: