Ich bin ein Jest/React Anfänger. In der it
des Spaßes muss ich warten, bis alle Versprechen vor der tatsächlichen Prüfung ausgeführt haben.Wie testet man eine React-Komponente im Unit-Test, die nach dem Fetch rendert?
Mein Code ist ähnlich wie folgt aus:
export class MyComponent extends Component {
constructor(props) {
super(props);
this.state = { /* Some state */ };
}
componentDidMount() {
fetch(some_url)
.then(response => response.json())
.then(json => this.setState(some_state);
}
render() {
// Do some rendering based on the state
}
}
Wenn die Komponente montiert ist, render()
läuft zweimal: einmal nach dem Konstruktor läuft, und einmal nach fetch()
(in componentDidMount()
) beendet und die verkettete Versprechen fertig Ausführung) .
Mein Test-Code ist ähnlich wie folgt aus:
describe('MyComponent',() => {
fetchMock.get('*', some_response);
it('renders something',() => {
let wrapper = mount(<MyComponent />);
expect(wrapper.find(...)).to.have.something();
};
}
Was ich von it
zurückkehren, läuft es nach dem ersten Mal render()
ausführt, aber vor dem zweiten Mal. Wenn ich zum Beispiel fetchMock.flush().then(() => expect(...))
zurückgebe, wird das zurückgegebene Versprechen vor dem zweiten Aufruf an render()
ausgeführt (ich glaube, ich kann verstehen, warum).
Wie kann ich warten, bis das zweite Mal render()
vor dem Ausführen expect()
aufgerufen wird?
Es klingt für mich wie Sie versuchen, zu viele Dinge in einem Test zu testen.Was Sie testen möchten, ist, dass Ihre Fetch-Funktion aufgerufen wird, wenn die Komponente geladen wird, dann haben Sie mehrere andere Tests, bei denen der Status explizit an sie übergeben wurde, und Sie können überprüfen, ob die Komponente ordnungsgemäß gerendert wird. –
@MattWatson Wenn ich (1) überprüfe, dass die Fetch-Funktion aufgerufen wird und (2) dass die Übergabe des Status ordnungsgemäß gerendert wird, konnte ich nicht überprüfen, dass (1.5) der Status richtig gesetzt wird. Wie überprüfe ich, ob der Status richtig eingestellt wurde? –