Wie schreibt man testen, verhöhnt die $route-Objekt in vue Komponenten
Ich habe eine Komponente, enthält die Anweisung, wie this.$route.fullPath
, wie soll ich das mock-Wert von fullPath
von $route
Objekt, wenn ich will, um zu testen, dass die Komponente?
InformationsquelleAutor Jerry Zhang | 2017-01-04
Du musst angemeldet sein, um einen Kommentar abzugeben.
Besten nicht spotten
vue-router
sondern verwenden Sie zum Rendern der Komponente, so erhalten Sie einen einwandfreien router. Beispiel:Dinge zu beachten:
render: h => h('router-view')
.totest
Komponente, aber andere möglicherweise erforderlich, wenn Sie referenzierttotest
zB.another_component
in diesem Beispiel.nextTick
für das HTML zu Rendern, bevor Sie es sehen kann/testen.Eines der Probleme ist, dass die meisten der Beispiele, die ich fand, bezogen auf die alte version von
vue-router
finden Sie die Migrationen docs, zB. einige Beispiele verwendenrouter.go()
was jetzt nicht funktioniert.hier ist eine komplette test-setup, das funktioniert. Das ist wohl der klarste Ansatz zu beschreiben, eine vollständige test-setup.
Vielen Dank für dieses Beispiel und den link zu Ihrem Projekt repo @SColvin. durchsuchen Ihrer specs hilft mir eine Menge, ich hoffe, um zu sehen, und sogar meine eigene Ressourcen auf, wie um zu testen, vue Komponenten in der Zukunft, es ist etwas, was da definitiv mehr (oder zumindest mehr für Menschen, die havent hatte eine Menge von tdd Erfahrung). Nochmals vielen Dank für die große Frage + ausgezeichnete Antwort.
link ist tot :/ (in Ihrem Kommentar)
hier wird die test-Datei, wie es war, damals im Februar. Die tests sind mehr jetzt, aber vielleicht weniger einfach zu bekommen begann mit.
InformationsquelleAutor SColvin
Ich bin nicht einverstanden mit der top Antwort - kann man mock
$route
ohne Problem.Auf der anderen Seite die Installation von vue-router mehrere Male auf den Basis-Konstruktor wird Probleme verursachen. Es fügt
$route
und$router
als nur-Lesen-Eigenschaften. Das macht es unmöglich, überschreiben Sie in Zukunft tests.Gibt es zwei Möglichkeiten, dies zu erreichen mit vue-test-utils.
Spott vue-router mit der mocks-option
Können Sie auch installieren, Vue Router sicher, indem createLocalVue:
Der Installation von vue-router sicher in tests mit createLocalVue
TypeError: Cannot set property $route of #<Vue$3> which has only a getter
.Hi Daniel, dieser Fehler wird ausgelöst, weil Sie bereits installiert haben, VueRouter während Ihres tests. Sobald Sie call-Vue.verwenden(VueRouter), $route und $router Hinzugefügt werden als nur-Lesen-Eigenschaften. Ändern, können die $route oder $router-Eigenschaften in einem test, müssen Sie nicht installieren, Vue Router auf die Globale Basis-Konstruktor.
Wie wollen Sie verspotten $store mit dem ersten Ansatz?
Erwähnenswert ist, dass die vue-cli erstellt eine
Vue.use(Router)
im router/index.js, die geladen wird in der globalen Vue. Wenn Sie sagen, einrouter.push
Aufrufs in Ihre Komponente, es ist importieren, global-read-only $router vor dem test (also kann es nicht werden verspottet).Sie können die mock - $route-Objekt mit einer push-Methode und es wird funktionieren!
InformationsquelleAutor Edd
Keine Antwort half mir, So dass ich Sie in Graben
vue-test-utils
Dokumentation und fand mich in einer Arbeitsgruppe beantworten, so dass Sie importieren müssen.Erstellten wir eine Probe
vue
Instanz. Während des Tests müssen SieshallowMount
so kann man sichvue
app-Instanz und router.Können Sie leicht passieren router und flache Halterung nicht und es gibt dir den Fehler. Wenn Sie übergeben möchten, speichern Sie Sie verwenden:
Dann pass store:
Dieser Lösung lösen Sie die folgenden Fehler:
this.$route.params.id
router-link
✔
InformationsquelleAutor Ilyas karim
Alle kudos an @SColvin für seine Antwort; geholfen, die Antwort zu finden in meinem Szenario, worin ich hatte eine Komponente mit einem router-link, warf Sie ein
während unit-test, weil Vue hatte nicht geliefert wurde, mit einem router. @SColvin Antwort zu schreiben, die testen, ursprünglich geliefert von vue-cli aus
zu
Nicht benötigen, um die übergabe von Parametern in der Ansicht, ich könnte die Vereinfachung der Komponente als Standard-Rendern, keine Notwendigkeit zu schieben und keine Notwendigkeit zu warten, nextTick. HTH jemand anderes!
InformationsquelleAutor 9swampy
Hinzufügen, um die Super Antwort von @SColvin, hier ist ein Beispiel für das arbeiten mit Avoriaz:
Glaube ich, dass diese Arbeit sollte mit vue-test-utils auch.
@/
vor dem Routen?Es ist eine gemeinsame Webpack beheben alias benutzt durch das Vue-team als Abkürzung zu den
src
- Verzeichnis.InformationsquelleAutor Franey
Werfen Sie einen Blick auf dieses Beispiel mit vue-test-utils, wo ich bin mocking beide router und speichern.
InformationsquelleAutor Daniel Kmak
Dies ist, was ich getan habe als pro dieser Artikel:
InformationsquelleAutor d512
Können Sie mock vm.$router durch Einstellung vm._routerRoot._router
Beispielsweise
Können Sie überprüfen Ihre source-code hier: https://github.com/vuejs/vue-router/blob/dev/dist/vue-router.js#L558
InformationsquelleAutor nhanbach
Einfachste Weg, die ich gefunden habe, ist zu verspotten, die $route.
InformationsquelleAutor Evan Burbidge
Einfachste Methode, die ich fand, ist die Verwendung localVue
Hoffe, es hilft!!!
InformationsquelleAutor Bharathkumar kamal