2016-04-03 15 views
0

auf Speicher aus dem Kontext abhängt Ich habe Probleme beim Einrichten von Tests für eine Komponente, die auf einem redux Geschäft verlässt sich aus dem Kontext überliefert ...Testen einer Komponente, die

Meine app hat eine Wurzelkomponente, die ihre Kinder gibt die redux Speicher als Kontext:

import ApplicationStore from './app-store.js' 

class Root extends Component { 
    getChildContext() { 
     return { store: ApplicationStore } 
    } 
    render(){...} 
} 

Root.childContextTypes = { 
    store: PropTypes.object, 
}; 

ich habe eine Komponente, die auf dem Speicher (überliefert von Kontext) abhängt:

class List extends Component { 
    render(){ 
    const items = this.context.store.getState(); 

    return items.map((_, i) => (
     <div key={i}>{_.name}</div> 
    )); 
    } 
} 

List.contextTypes = { 
    store: PropTypes.object, 
}; 

Also meine Frage ist: wie ich „injizieren“ die st ore Objekt in den Kontext meiner Komponente? Würde ich unmock(./app-store.js) haben? Außerdem, wie kann ich den Laden mit ein paar Fixtures füllen?

Danke!

Antwort

0

Ich weiß, dass dies Ihre Frage nicht beantworten, aber ich möchte Ihnen die React.js Dokumentation über Kontexte Punkt:

Die meisten Anwendungen werden nie Kontext verwenden müssen. Vor allem, wenn Sie gerade mit React beginnen, möchten Sie wahrscheinlich keinen Kontext verwenden. Durch die Verwendung von Kontext wird Ihr Code schwerer verständlich, da der Datenfluss weniger klar ist. Es ähnelt der Verwendung globaler Variablen, um den Status durch Ihre Anwendung zu übergeben.

und

Verwenden Kontext nicht Ihre Modelldaten durch Komponenten zu übergeben. Das explizite Einfädeln Ihrer Daten durch den Baum ist viel einfacher zu verstehen. Wenn Sie Kontext verwenden, sind Ihre Komponenten stärker gekoppelt und weniger wiederverwendbar, da sie sich je nachdem, wo sie gerendert werden, unterschiedlich verhalten.

Wenn Sie Requisiten Ihren Shop (oder auch nur die benötigten Teile davon), um Ihr Kind Komponenten passieren, dann ist Ihr Problem schon weil in Ihrem Test gelöst, geben Sie einfach Ihre verspottet oder stubbed Speicher injizieren kann.

+0

Danke, @ Nicole. Ich habe das durchgelesen, als ich die App geschrieben habe und beschlossen habe, den Store als Kontext zu übergeben, aber ich habe es mir nicht überlegt. –

+1

Wenn Sie React with Redux verwenden, sollten Sie außerdem die offizielle React Redux-Bibliothek verwenden, um Ihre Komponenten mit dem Store zu verbinden (https://github.com/reactjs/react-redux). Es verwaltet das Store-Abonnement für Sie. Von dort aus können Sie sich darauf konzentrieren, nur Ihre "normale" Komponente zu testen, die nur Requisiten und die von Ihnen geschriebenen "mapStateToProps" -Funktionen verwendet, und sich nicht darum kümmern zu müssen, irgendetwas mit einem Geschäft zu testen. Siehe [Verwendung mit Reagieren] (http://redux.js.org/docs/basics/UsageWithReact.html) und [Writing Tests] (http://redux.js.org/docs/recipes/WritingTests.html) Dokumentseiten. – markerikson

+0

Danke, @markerikson. Ich landete meine Wurzel-Komponente mit '' von react-redux. –

Verwandte Themen