Mam React Component, który wywołuje metodę z innego modułu.
Moduł po prostu zwraca 1 metodę:
export default (url, method, authorization, body) => {
const headers = { "Content-Type": "application/json" }
if (authorization) headers.Authorization = localStorage.getItem("id_token");
return fetch(url, {
method,
headers,
body: JSON.stringify(body)
}).then(res => res.json());
}
Chciałbym kpić z tej metody / modułu, więc prawdziwy kod nie zostanie wywołany podczas testowania Komponentów, które go używają.
Jestem nowicjuszem w React / Jest / Enzyme, więc mogłem przegapić coś łatwego.
W moim pliku testowym:
jest.mock("../../utils/fetch.js", () => () => {
Promise.resolve({_id: 1});
});
import fetch from "../../utils/fetch";
Gdzie stosuje się metodę:
return fetch("/api/items", "post", true, newItem).then(res => {
this.props.history.push(`/items/${res._id}`);
}).catch(console.log);
Odpowiedzi:
1 dla odpowiedzi № 1Masz więc moduł, który zwraca funkcję, która zwróci obietnicę. Jeśli chcesz przetestować szczęśliwą ścieżkę, po prostu odwzajemnij obietnicę z fałszywego dowodu:
jest.mock("./my-function.js", () => () => Promise.resolve("foo"));
jeśli musisz ustawić wynik funkcji podczas testu, wyśmiewaj moduł ze szpiegiem i ustaw wynik później w teście:
jest.mock("./my-function.js", () => jest.fn());
import myFunction from "./my-function.js"
describe("foo",()=>{
it("the happy pass",()=> {
myFunction.mockImplementation(() => Promise.resolve("foo"))
//your assertion here
})
it("when it fails",()=> {
myFunction.mockImplementation(() => Promise.reject())
//your assertion here
})
})
})
Zauważ, że musisz wyśmiać go na wierzchumoduł. W przeciwnym razie oryginał zostanie zaimportowany, a następnie zastąpiony modułem za pomocą makiety, co nie będzie miało wpływu na importowane. Pomyśl o kpiącym sposobie mówienia, jak rozwiązać import. Więc kpiny z czegoś po zaimportowaniu nie będą miały żadnego efektu.