Reaktion Warnung: Fehlgeschlagene Kontexttypen: Der erforderliche Kontext 'router' wurde nicht in 'Komponente' angegeben

8

Ich versuche, eine React-Komponente zu testen, die den react-router separat von app.js benötigt.

Ich habe eine Komponente, die eine Umleitung mit dem Mixin Router.Navigation wie folgt macht:

%Vor%

Ich habe versucht, einen Test dafür zu schreiben, aber lief gegen eine Wand. Abgesehen davon, dass ich transitionTo nicht wie erwartet testen kann, bin ich in meinen Jest-Tests auch auf diese Fehlermeldung gestoßen:

Warnung: Fehlgeschlagene Kontexttypen: Der erforderliche Kontext router wurde nicht in Searchbar angegeben.

Weiß jemand, wie ich die Warn- und Bonusfrage loswerden kann, wie ich testen kann, dass der Übergang wie erwartet funktioniert?

Ich habe diese und dieses Gespräch auf Github hier untersucht: Ссылка ist das nächste Ich Habe das Problem gefunden. Es sieht so aus, als ob ich den Router separat exportieren muss, aber das scheint eine Menge Overhead zu sein, um Komponententests einfach auszuführen ohne die Warnung a la Ссылка

Ist das wirklich der richtige Weg?

    
alengel 14.05.2015, 12:04
quelle

4 Antworten

5

In Version 0.13 von React Router waren die Mixins Navigation und State veraltet. Stattdessen existieren die Methoden, die sie bereitstellen, für das Objekt this.context.router . Die Methoden sind nicht mehr veraltet, aber wenn du this.context.router explizit benutzt, brauchst du das Mixin nicht (aber du musst contextTypes direkt deklarieren); oder Sie können das Mixin verwenden, müssen aber this.context.router nicht direkt verwenden. Die Mixin-Methoden greifen auf Sie zu.

In beiden Fällen wird das Router#run -Objekt nicht an den Kontext übergeben, es sei denn, Sie rendern Ihre Komponente über React Router (über router ), und natürlich können Sie die Überleitungsmethode nicht aufrufen. Das ist es, was die Warnung Ihnen sagt: Ihre Komponente erwartet, dass der Router an sie weitergeleitet wird, aber sie kann sie nicht finden.

Um dies isoliert zu testen (ohne ein Routerobjekt zu erstellen oder die Komponente über Router#run auszuführen), könnten Sie ein verspottetes router -Objekt im Kontext der Komponente an der richtigen Stelle platzieren und testen, dass Sie transitionTo aufrufen. darauf mit dem richtigen Wert.

    
Michelle Tilley 14.05.2015, 15:46
quelle
4

Hier ist meine Jest-Datei für eine vollständige Antwort auf diese Frage. Der letzte Absatz von BinaryMuse hat mich auf den richtigen Weg gebracht, aber ich finde Codebeispiele immer am hilfreichsten, also hier als Nachschlagewerk.

%Vor%

Hoffe, das hilft jemandem in der Zukunft.

    
alengel 19.07.2015 08:15
quelle
3

Da router stark von dem weniger bekannten Feature context von React abhängig ist, müssen Sie es wie beschrieben stubben. hier

%Vor%

Und verwende wie:

%Vor%     
Yevgen Safronov 14.06.2015 21:43
quelle
2

Meine Antwort ist nicht Jest-spezifisch, aber es könnte Menschen helfen, das gleiche Problem zu lösen. Ich habe eine Klasse erstellt, die router context umschließt.

Dann fügen Sie in Ihrem Test einfach
<ContextWrapper><YourComponent/></ContextWrapper>

hinzu

Es kann nützlich sein, andere Dinge wie ReactIntl einzupacken.

Beachten Sie, dass Sie die Möglichkeit verlieren werden, seichtes Rendering zu verwenden, aber das ist bereits bei ReactIntl der Fall.

Ich hoffe, dass es jemandem hilft.

ContextWrapper.js

%Vor%     
D0m3 27.01.2016 16:32
quelle

Tags und Links