/ / Mock function module with jest i enzym - reactjs, szyderczy, jestjs, enzym

Mock moduł funkcyjny z żartem i enzymem - reactwy, szyderczy, żart, enzym

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 № 1

Masz 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.