我正在尝试对使用fetch
进行REST API调用的客户端进行单元测试。我无法弄清楚如何正确模拟和监视用于进行这些访存调用的客户端功能。
以下是此客户端的构造示例:
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
调用来进行此工作,但想在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
?另外,我能否以更好的方式来构造此测试,以证明更新的项目是正确的?