Was ist der beste Weg zu Test, dass ein asynchroner Aufruf innerhalb componentDidMount
den Status für eine React-Komponente setzt? Für den Kontext sind die Bibliotheken, die ich zum Testen verwende, Mocha
, Chai
, Enzyme
und Sinon
.Testen von Async-Aufrufen in componentDidMount, die den Status von React Component setzen
Hier ist ein Beispielcode:
/*
* assume a record looks like this:
* { id: number, name: string, utility: number }
*/
// asyncComponent.js
class AsyncComponent extends React.Component {
constructor(props) {
super(props);
this.state = {
records: []
};
}
componentDidMount() {
// assume that I'm using a library like `superagent` to make ajax calls that returns Promises
request.get('/some/url/that/returns/my/data').then((data) => {
this.setState({
records: data.records
});
});
}
render() {
return (
<div className="async_component">
{ this._renderList() }
</div>
);
}
_renderList() {
return this.state.records.map((record) => {
return (
<div className="record">
<p>{ record.name }</p>
<p>{ record.utility }</p>
</div>
);
});
}
}
// asyncComponentTests.js
describe("Async Component Tests",() => {
it("should render correctly after setState in componentDidMount executes",() => {
// I'm thinking of using a library like `nock` to mock the http request
nock("http://some.url.com")
.get("/some/url/that/returns/my/data")
.reply(200, {
data: [
{ id: 1, name: "willson", utility: 88 },
{ id: 2, name: "jeffrey", utility: 102 }
]
});
const wrapper = mount(<AsyncComponent />);
// NOW WHAT? This is where I'm stuck.
});
});
Würden Sie nicht einfach behaupten, dass Ihr Status korrekt aktualisiert wurde? Ich bin nicht so vertraut mit der Verwendung von Enzyme und nicht mit der 'shallow()' API, aber mit seicht gerenderten Komponenten können Sie davon ausgehen, dass die Zustandsaktualisierung synchron ist. –
Meine Frage konzentriert sich mehr auf den asynchronen Teil davon - wenn ich den Zustand nach dem Rendern behaupten würde, wäre 'records' das leere Array. Stattdessen hoffe ich, die Assertion nach dem Versprechen in 'componentDidMount' zu setzen, um den Status auf ein nicht leeres Array zu setzen. – wmock
In der Praxis ist es die beste Vorgehensweise, diese Funktionalität aus der Komponente zu entfernen, damit sie separat getestet werden kann, und Sie können die Komponente testen, um sie zu testen. Aber Sie könnten immer setTimeout verwenden. Sie haben die Kontrolle über Nock, so dass Sie ziemlich sicher sein können, wie lange die Antwort dauern wird. – aray12