sagen, dass ich diese einfache Reagieren Komponente haben:Wie Unit Test Promise catch() -Methode Verhalten mit async/erwarten in Jest?
class Greeting extends React.Component {
constructor() {
fetch("https://api.domain.com/getName")
.then((response) => {
return response.text();
})
.then((name) => {
this.setState({
name: name
});
})
.catch(() => {
this.setState({
name: "<unknown>"
});
});
}
render() {
return <h1>Hello, {this.state.name}</h1>;
}
}
unter die Antworten gegeben und etwas mehr Forschung zu diesem Thema habe ich mit dieser Endlösung zu testen, die resolve()
Fall kommen:
test.only("greeting name is 'John Doe'", async() => {
const fetchPromise = Promise.resolve({
text:() => Promise.resolve("John Doe")
});
global.fetch =() => fetchPromise;
const app = await shallow(<Application />);
expect(app.state("name")).toEqual("John Doe");
});
Das funktioniert gut. Mein Problem testet jetzt den catch()
Fall. Die folgende funktionierte nicht, wie ich es erwartet funktionieren:
test.only("greeting name is 'John Doe'", async() => {
const fetchPromise = Promise.reject(undefined);
global.fetch =() => fetchPromise;
const app = await shallow(<Application />);
expect(app.state("name")).toEqual("<unknown>");
});
Die Behauptung fehlschlägt, name
ist leer:
expect(received).toEqual(expected)
Expected value to equal:
"<unknown>"
Received:
""
at tests/components/Application.spec.tsx:51:53
at process._tickCallback (internal/process/next_tick.js:103:7)
Was bin ich?
Sie sind nicht die erste Person, die Ihnen empfohlen hat. Ich verschiebe die Anfrage nach 'componentDidMount'. React-Dokumente empfehlen diesen Lifecycle-Rückruf, um die Netzwerkanforderung zu instanziieren. Aber neben dem Testen und meiner speziellen Frage, ist es eine schlechte Übung, die Netzwerkanforderung im Konstruktor zu machen? Wenn ja warum? –
Habe gerade deine Lösung getestet und es hat gut funktioniert und ich verstehe diese Dinge jetzt besser, also vielen Dank dafür. Ich bin nur neugierig auf meine vorherige Frage ... –
Ein Problem mit der Verwendung des Konstruktors vs des Lebenszyklus ist, dass Sie es möglicherweise Daten unnötig aufrufen nennen. Sie können die Komponente instanziieren, sie dann aber nie bereitstellen, sodass der Netzwerkaufruf nie verwendet wurde. Im Allgemeinen denke ich, dass es wahrscheinlich in jeder Hinsicht funktionieren würde, aber es gibt bestimmte Randfälle, in denen es weniger ideal ist, also wird nur die Verwendung der Lebenszyklen empfohlen. Es kann andere Nachteile geben; nicht sicher. – TLadd