Любой способ модифицировать шпионов Jasmine на основе аргументов?
У меня есть функция, которую я бы хотел проверить, которая дважды вызывает внешний API-интерфейс, используя разные параметры. Я хотел бы высмеять этот внешний API с помощью шпиона Jasmine и вернуть разные вещи на основе параметров. Есть ли способ сделать это в Жасмине? Лучшее, что я могу придумать, это взлом с использованием 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;
}
});
});
});
Ответы
Ответ 1
callFake
- это правильный путь, но вы можете упростить его, используя объект для хранения возвращаемых значений
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]
});
});
});
В зависимости от версии Jasmine синтаксис несколько отличается:
- 1.3.1:
.andCallFake(fn)
- 2.0:
.and.callFake(fn)
Ресурсы:
Ответ 2
Вы также можете использовать $provide
для создания шпиона. И макет с использованием and.returnValues
вместо and.returnValue
для передачи параметризованных данных.
В соответствии с документами Jasmine:. Связывая шпион с and.returnValues
, все вызовы функции возвращают определенные значения до тех пор, пока они не дойдут до конца списка возвращаемых значений, после чего вернет undefined для всех последующих вызовов.
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
}));
});