Próbuję objąć funkcję w Jasmine, ale pojawia się błąd „TypeError: inputField.setAttribute is not a function”. Czego potrzebuję, żeby to naprawić? Czy mam z tego kpić? Kilka dni starałem się to naprawić, ale nie znalazłem żadnego rozwiązania.
Każdy, kto wie, co muszę zrobić?
Funkcja:
setInput() {
const inputField = this.$document[0].querySelector('.input-field');
if (this.inputElement.styles.includes('InputYes')) {
inputField.setAttribute('input-yes', '');
} if (this.inputElement.styles.includes('InputNo')) {
inputField.setAttribute('input-no', '');
}
}
Jaśmin:
describe('setInput method', () => {
it('test', () => {
// given
var spy = spyOn(document, 'querySelector').and.returnValue(angular.element('<input class="input-field" type="text">'));
const inputController = new InputController(this.$document);
inputController.inputElement = {
styles: ['InputYes']
};
// when
inputController.setInput();
// then
expect(inputController.$document[0].querySelector('.input-field')[0].getAttribute('input-yes')).toBe('');
expect(spy).toHaveBeenCalledWith('<input class="input-field" input-yes type="text">');
});
});
2 odpowiedzi
Jeśli setAttribute()
nie jest funkcją, element nie został ustawiony zgodnie z oczekiwaniami. Może być coś nie tak z Twoją deklaracją inputField
. Następujące pomyślnie deklaruje inputField i ustawia atrybut:
const inputField = document.querySelector('.input-field');
inputField.setAttribute('input-yes', '');
Oto przykład, w którym skrzypce wyświetlają zamierzony wynik na konsoli: jsfiddle.net/Remy90/vq79s6kz/
Zgaduję, ale na podstawie szybkiego przeglądu kodu. Twój kod uzyskuje dostęp do $document
jako tablicy:
this.$document[0].querySelector('.input-field');
Ale twój szpieg jest tylko na dokumencie:
var spy = spyOn(document, 'querySelector').and.returnValue(angular.element('<input class="input-field" type="text">'));
Na podstawie udostępnionego przez Ciebie kodu przypuszczam, że $document[0]
to nie to samo co document
Postuluję, że jeśli szpiegujesz obiekt $document
w komponencie, możesz uzyskać lepsze wyniki. Lubię to:
var spy = spyOn(inputController.$document[0], 'querySelector').and.returnValue(angular.element('<input class="input-field" type="text">'));