Mam funkcję, którą chciałbym przetestować, która dwukrotnie wywołuje metodę zewnętrznego interfejsu API, używając różnych parametrów. Chciałbym wyśmiewać ten zewnętrzny interfejs API za pomocą szpiega Jasmine i zwracać różne rzeczy w oparciu o parametry. Czy można to zrobić w Jasmine? Najlepsze, co mogę wymyślić, to hack przy użyciu 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')
ispyOn(fake, 'method').withArgs('123').and.returnValue(98765)
..withArgs
nie działa na mnie w jaśminowym 2,0.withArgs
nie jest naprawdę dostępna - miałem na myśli, że taka metoda miałaby sens przy pisaniu testów.Możesz także użyć
$provide
do stworzenia szpiega. I mock używaćand.returnValues
zamiastand.returnValue
przekazywania danych sparametryzowanych.źródło
returnValues
do obsługi wielu połączeńexternalApi.get.and.returnValues('abc','123')
wywoływana jest wit
funkcji. W przeciwnym razie, jeśli ustawisz listę wartości, w innym przypadku, to nigdy nie zadziała, ponieważ kolejność przeprowadzania testów nie jest przewidywalna. W rzeczywistości testy nie powinny zależeć od kolejności, w jakiej są wykonywane.W moim przypadku miałem komponent, który testowałem, aw jego konstruktorze jest usługa konfiguracyjna z metodą o nazwie getAppConfigValue, która jest wywoływana dwukrotnie, za każdym razem z różnymi argumentami:
W mojej specyfikacji podałem ConfigService w TestBed w następujący sposób:
Tak więc, o ile podpis dla getAppConfigValue jest taki sam, jak określony w rzeczywistej usłudze ConfigService, to, co funkcja robi wewnętrznie, można zmodyfikować.
źródło