Jest.js 模拟节点获取时出现“body used already for”错误?

egmofgnx  于 2023-05-15  发布在  Jest
关注(0)|答案(2)|浏览(230)

我正在尝试用jest来模拟我的azure函数的node-fetch。在测试中,我有以下内容:
index.test.ts

jest.mock("node-fetch");
import fetch from "node-fetch";
const {Response} = jest.requireActual("node-fetch");

// Setup code here...

const expectedResult: User = {
        user_id: "1",
        email: "testEmail@email.com",
        name: "testUser",
        nickname: "test",
        picture: "pic",
        app_metadata: {
            email: "testEmail@email.com"
        }
    };
    (fetch as jest.MockedFunction<typeof fetch>).mockReturnValue(new Response(JSON.stringify(expectedResult)));

当我调用它时,我会执行以下操作:
index.ts

const options = {
                method: 'PATCH',
                headers: { "Content-Type": 'application/json', authorization: `Bearer ${accessToken}`},
                body: body
            };

const userResponse = await fetch(usersEndpoint, options);
const jsonResult = await userResponse.json();
context.res = {
                body: jsonResult
            };

当它点击“awaituserResponse.json()”时,我得到“body used already for”错误。我有另一个测试,它以类似的方式设置,所以我不知道为什么它说身体是从等待获取调用用完。任何帮助将不胜感激。

jdzmm42g

jdzmm42g1#

响应对象应该在每个请求中使用一次,而模拟的fetch为多个请求返回相同的对象。此外,它应该返回响应的promise,而不是响应本身。
一个正确的方法来嘲笑它是:

fetch.mockImplementation(() => Promise.resolve(
  new Response(JSON.stringify(expectedResult))
));

没有必要使用Response并遵循它施加的限制,特别是因为Node中没有原生Response
它可以是:

fetch.mockResolvedValue({
  json: jest.fn(() => expectedResult)
});
13z8s7eq

13z8s7eq2#

我的问题是我调用了另一个使用fetch的函数,它正在解决我的模拟实现。有一次我模仿了这个返回值:

(fetch as jest.MockedFunction<typeof fetch>).mockReturnValue(new Response(JSON.stringify(expectedResult)));

最后成功了
@Estus Flask的回答最终也奏效了。

相关问题