2017-04-10 1 views
4

Ich aktualisiere schließlich meine Komponenten von React.createClass() zu ES6-Klassen. Der erste Fehler, den ich in meinen Tests bin zu sehen ist, dass einige meiner sinon.stub() Anrufe werden scheitern, weil jscodeshift -t react-codemod/transforms/class.js meine Komponentenmethoden umgewandelt, um die Eigenschaft initializer Vorschlag zu verwenden, dhReact - wie stoße ich Komponentenmethoden ab, die die Property Initializersyntax verwenden?

class Foo extends React.Component { 
    componentWillMount() { 
    this.fetchSomeData(this.props); 
    } 
    componentWillReceiveProps(nextProps) { 
    if (nextProps.someProp !== this.props.someProp) { 
     this.fetchSomeData(nextProps); 
    } 
    } 
    fetchSomeData = (props) => { 
    ... 
    }; 
    render() { 
    ... 
    } 
} 

Meine Frage ist: Wie kann ich Stummel fetchSomeData() mit diese neue Syntax? Meine Tests sehen wie sinon.stub(Foo.prototype, 'fetchSomeData'); aus, was nicht mehr funktioniert, vorausgesetzt, dass fetchSomeData nicht mehr auf dem Prototyp ist.

Danke!

+1

ES7 wurde veröffentlicht * letztes Jahr * (2016). Eigenschaftsinitialisierungen sind ein * Vorschlag *. –

+0

Hat Ihr Test Zugriff auf die Instanz der Komponente? Wenn dies der Fall ist, können Sie sinon.stub (componentInstance, 'fetchSomeData') und dann componentInstance.render(); – jeznag

+0

@jeznag guten Punkt, danke. Daran habe ich nicht gedacht. Aber ich lasse das Enzym den Render-Lebenszyklus handhaben, und ich glaube nicht, dass das eine gute Lösung für mich wäre. – mulleady1

Antwort

3

In diesem Beispiel wird fetchSomeData() tatsächlich an this und nicht an Foo.prototype angehängt, so dass es absolut keine Möglichkeit gibt, die Methode vor dem Erstellen der Instanz zu stubben. Die Problemumgehung besteht darin, die Logik in fetchSomeData() an einen anderen Speicherort zu verschieben, der stubbed sein kann. Oder verwenden Sie eine andere Syntax, um die Methode zu definieren.

Verwandte Themen