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">');
    });
});
0
can 20 listopad 2019, 16:58

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/

0
Remy 21 listopad 2019, 16:23

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">'));
1
JeffryHouser 27 grudzień 2019, 06:19