TypeError: scrollIntoView ist keine Funktion

Lesezeit: 3 Minuten

Benutzeravatar von Charklewis
Charklewis

Ich bin neu in der React-Testing-Library/Jest und versuche, einen Test zu schreiben, um zu sehen, ob die Navigation von Routen (mit React-Router-Dom) korrekt durchgeführt wird. Bisher habe ich das verfolgt Liesmich und das Lernprogramm zur Verwendung.

Eine meiner Komponenten verwendet scrollIntoView in einer lokalen Funktion und dies führt dazu, dass der Test fehlschlägt.

TypeError: this.messagesEnd.scrollIntoView is not a function

  45 |
  46 |     scrollToBottom = () => {
> 47 |         this.messagesEnd.scrollIntoView({ behavior: "smooth" });
     |                          ^
  48 |     }
  49 |
  50 | 

Dies ist die Funktion in meiner Chatbot-Komponente:

componentDidUpdate() {
    this.scrollToBottom();
}

scrollToBottom = () => {
    this.messagesEnd.scrollIntoView({ behavior: "smooth" });
}

Und dies ist ein Beispiel der Tests, die fehlschlagen:

test('<App> default screen', () => {

    const { getByTestId, getByText } = renderWithRouter(<App />)

    expect(getByTestId('index'))

    const leftClick = {button: 0}
    fireEvent.click(getByText('View Chatbot'), leftClick) <-- test fails

    expect(getByTestId('chatbot'))

})

Ich habe versucht, eine Scheinfunktion zu verwenden, der Fehler bleibt jedoch weiterhin bestehen.

Hier wird this.messageEnd zugewiesen:

    <div className="chatbot">
        <div className="chatbot-messages">
            //render messages here
        </div>
        <div className="chatbot-actions" ref={(el) => { this.messagesEnd = el; }}>
            //inputs for message actions here
        </div>
    </div>

Ich habe auf Code aus dieser Stapelüberlauffrage verwiesen: Wie scrolle ich in React nach unten?

LÖSUNG

test('<App> default screen', () => {

    window.HTMLElement.prototype.scrollIntoView = function() {};

    const { getByTestId, getByText } = renderWithRouter(<App />)

    expect(getByTestId('index'))

    const leftClick = {button: 0}
    fireEvent.click(getByText('View Chatbot'), leftClick)

    expect(getByTestId('chatbot'))

})

  • Können Sie posten, wo Sie den Wert zuweisen? this.messagesEnd?

    – Gio Polvara

    13. November 2018 um 7:43 Uhr

  • Klar, ich habe die ursprüngliche Frage aktualisiert.

    – Charklewis

    13. November 2018 um 21:27 Uhr

  • Würde es funktionieren, wenn Sie das Casting erzwingen würden? (<HTMLElement>this.messagesEnd).scrollIntoView({ behavior: "smooth" });

    – Iskandar Reza

    14. November 2018 um 0:28

scrollIntoView ist nicht in jsdom implementiert. Hier ist das Problem: Verknüpfung.

Sie könnten es zum Laufen bringen, indem Sie es manuell hinzufügen:

window.HTMLElement.prototype.scrollIntoView = function() {};

  • Danke @Gpx, das hat funktioniert. Ich habe die Lösung zum ursprünglichen Beitrag hinzugefügt.

    – Charklewis

    16. November 2018 um 3:05

  • Können Sie bitte etwas Kontext hinzufügen? Wo soll ich diese Zeile in React platzieren?

    – Benutzer158

    3. Februar um 10:55 Uhr

  • Es hängt davon ab, wie Ihre Testumgebung eingerichtet ist. In Jest können Sie Setup-Dateien haben: jestjs.io/docs/configuration#setupfiles-array

    – Gio Polvara

    16. März um 19:35 Uhr

Kritis Benutzeravatar
Kriti

Wenn wir die Funktion „scrollIntoView“ in einer React-Anwendung mithilfe der React-Testing-Bibliothek einem Unit-Test unterziehen möchten, können wir die Funktion mit „Jest“ verspotten.

window.HTMLElement.prototype.scrollIntoView = jest.fn()

  • Es ist, als würden wir uns über die scrollIntoView-Funktion lustig machen.

    – Kriti

    14. Februar 2020 um 13:56 Uhr

  • @Kriti. Bitte erläutern Sie in der Antwort selbst, wie dieser Code dem OP hilft, sein Problem zu lösen. Bitte lesen Sie diesen Artikel, um besser zu verstehen, was eine Antwort ist. Bitte schauen Sie sich auch den Site-Rundgang an

    – Marcello B.

    14. Februar 2020 um 19:28


  • Nur eine Beobachtung. Richtig wäre die Verwendung ohne sofortigen Aufruf. Also statt jest.fn ()verwenden jest.fn ohne Klammern.

    – dunkelziul

    20. Februar 2021 um 13:25 Uhr

  • Das Problem beim Verspotten von scrollIntoView besteht darin, dass wir zwar die Scheinfunktion dazu bringen können, eine andere Funktion aufzurufen, wir aber nie sicher sein können, dass das Scrollen diese andere Funktion in einem realen Fall auslöst. Nehmen wir einen unendlichen Bildlauf, ich kann den Test immer noch bestehen und meine InfiniteScroller-Komponente löst im realen Fall keinen Ladevorgang mehr aus.

    – KeitelDOG

    7. März 2021 um 13:19 Uhr

1453740cookie-checkTypeError: scrollIntoView ist keine Funktion

This website is using cookies to improve the user-friendliness. You agree by using the website further.

Privacy policy