У меня есть функция, которую я хотел бы проверить, которая дважды вызывает метод внешнего API, используя разные параметры. Я хотел бы издеваться над внешним API с помощью шпионского жасмина и возвращать разные вещи в зависимости от параметров. Есть ли способ сделать это в Жасмин? Лучшее, что я могу придумать, это взломать с помощью 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')
иspyOn(fake, 'method').withArgs('123').and.returnValue(98765)
..withArgs
не работает для меня в Жасмин 2.0.withArgs
на самом деле не доступно - я имел в виду, что такой метод будет иметь смысл при написании тестов.Вы также можете использовать
$provide
для создания шпиона. И использовать макетand.returnValues
вместо того,and.returnValue
чтобы передавать параметризованные данные.источник
returnValues
для поддержки нескольких вызововexternalApi.get.and.returnValues('abc','123')
вызывается внутриit
функции. В противном случае, если вы установите список значений, иначе где, он никогда не будет работать, потому что порядок выполнения тестов не предсказуем. На самом деле тесты не должны зависеть от порядка их выполнения.В моем случае у меня был компонент, который я тестировал, и в его конструкторе есть служба конфигурации с методом getAppConfigValue, который вызывается дважды, каждый раз с разными аргументами:
В моей спецификации я предоставил ConfigService в TestBed следующим образом:
Таким образом, до тех пор, пока подпись для getAppConfigValue будет такой же, как указано в фактическом ConfigService, то, что функция делает внутри, может быть изменено.
источник