Я пытаюсь выполнить модульное тестирование клиента, который используется для вызовов REST API, используя fetch
. Мне сложно понять, как правильно имитировать и шпионить за функциями клиентов, которые используются для выполнения этих вызовов выборки.
Вот пример того, как построен этот клиент:
export const client = (param1, param2) => {
const getItem = (id) => fetch(fakeUrl, {method: GET});
const updateItem = (id) => fetch(fakeUrl, {method: POST});
return {
getItem: getItem,
updateItem: updateItem
}
В моем тестовом файле для клиента я пытаюсь протестировать updateItem
и имитировать getItem
, потому что он вызывается изнутри. Сначала я попытался просто имитировать fetch
, но я бы предпочел имитировать реализацию getItem
, чтобы просто вернуть нужный элемент для моего теста.
В настоящее время у меня это работает, высмеивая каждый fetch
call, но хотел бы создать слежку за getItem
, чтобы убедиться, что он вызывается с правильными параметрами, и иметь возможность имитировать его возвращаемое значение.
it("Should return the updated item", async () => {
expect.assertions(1);
// Setup
const item = {
id: "123
};
// Get item
fetch.mockResponseOnce(JSON.stringify({ item }));
// Update item with data
fetch.mockResponseOnce(JSON.stringify({ ...item, data }));
// When
const updatedItemWithData = await client(
"/item",
"fakeToken"
).updateItem("123456", data);
// Then
expect(updatedItemWithData).toEqual({ ...item, data });
});
В приведенном выше коде моей целью было проверить, что updateItem
возвращает то, что я думаю. Элемент обновления сначала должен получить элемент, поэтому у меня есть первая fetch
имитация для возврата ожидаемого элемента. Затем, после обработки некоторых данных, я делаю еще один вызов fetch
для обновления элемента, поэтому у меня есть второе фиктивное значение.
Вопрос : Как мне написать тест, чтобы что я могу высмеивать getItem
целиком, а не только fetch
? Кроме того, могу ли я лучше структурировать этот тест, чтобы доказать, что обновленный элемент верен?