2016-03-30 12 views
2

Ich verwende Jest, und ich habe einige Komponenten wie:Gibt es beim Testen einer React-Komponente eine Möglichkeit, die Nichtlebenszyklusmethoden direkt aufzurufen?

var TestClass = react.createClass({ 
    foo: function() { 
    return "test"; 
    }, 
    render: function() { 
    return <div />; 
    } 
}); 

Und ich möchte eine Einheit Test speziell für TestClass 'foo Methode schreiben. Ich

sah, dass Call a React component method from outside vorgeschlagen dies möglich sein sollte - einfach die Komponente im Test machen und es nennen:

describe("TestClass", function() { 
    it("should access internal methods", function() { 
    var test = <TestClass /> 

    expect(test.foo()).toBeTruthy() 
    } 
}); 

Von dieser Antwort auf die Frage würde ich diesen Test erwarten, passieren, sondern:

test.foo ist keine Funktion

Habe ich diese Antwort falsch verstanden?

Im Allgemeinen würde ich es vorziehen, nicht-Lebenszyklus-Methoden auf diese Weise zu testen - es würde eine bessere Granularität geben, aber wenn dies nicht möglich ist, gibt es eine vernünftige Alternative?

Zum Beispiel, wie könnte man eine Methode testen, die als Requisite an das Kind einer Komponente ohne diese Fähigkeit weitergegeben wird?

+1

Ich würde vermuten, dass die Variable 'test' in Ihrem Test keine Instanz der Klasse ist, sondern nur die gerenderte Komponente (oder was auch immer' .renderIntoDocument' zurückgibt). –

+0

Das ist, was ich bekomme, um ein künstliches Beispiel für Stack-Überlauf zusammen zu schlagen! Will bearbeiten – ttrmw

+0

'expect (TestClass.prototype.foo()). ToBeTrothy();' –

Antwort

0

Verwendung renderIntoDocument:

import ReactTestUtils from 'react-addons-test-utils'; 

... 

const test = ReactTestUtils.renderIntoDocument(
    <TestClass /> 
); 
expect(test.foo()).toBeTruthy(); 
+0

Dokument ist nicht definiert ... Dies würde nur im Browser funktionieren. : \ –

+0

Richtig - wir verwenden renderIntoDocument von ReactTestUtils immerhin :) – Anuj

0

Wenn Sie Enzym statt ReactTestUtils verwenden, und Sie verwenden Enzym Mount Renderer, dann können Sie .instance() auf der ReactWrapper rufen Sie die ReactComponent abzurufen.

Verwandte Themen