我正在尝试测试一个调用 API 的组件,我遇到了 MSW,并认为这会很棒。
const server = setupServer(
rest.get('http://localhost:3001/vote/test-slug', (req, res, ctx) =>
res(ctx.delay(500), ctx.status(200), ctx.json({ data: {alreadyVoted: `1`}} )),
),
);
这是我设置来处理捕获的服务器。在后台我使用 fetch 在我的组件中进行 API 调用,它看起来像这样
apiFetchData = (params) => {
const res = await fetch(url, options);
const data = (await res.json()) || null;
const response: fetchJsonResponse = {
data,
statusCode: res.status,
error: res.status !== 200,
success: res.status === 200,
};
}
我的组件具有这样的 onload 使用效果:
const component = () => {
useEffect(() => {
async function voteCheck() {
const result = await apiFetchData(
'http://localhost:3001/vote/test-slug',
);
if (result.data.alreadyVoted) {
setHasUserVoted(result.data.alreadyVoted);
}
setLoading(false);
}
voteCheck();
}, []);
}
当我运行测试时
await act(async () => {
render(
<VoteButton />,
);
});
我从我的 apiFetchData 收到以下错误
UseEffect result {
data: {
error: 'invalid json response body at reason: Unexpected end of JSON input'
},
hasData: false,
statusCode: 500,
error: true,
errorType: 'application'
}
(我正在使用 jest-mock-fetch),我得到的结果是这样的
Response {
size: 0,
timeout: 0,
[Symbol(Body internals)]: { body: <Buffer >, disturbed: false, error: null },
[Symbol(Response internals)]: {
url: undefined,
status: 200,
statusText: 'OK',
headers: Headers { [Symbol(map)]: [Object: null prototype] },
counter: undefined
}
}
我被卡住了,似乎 MSW 正在捕获来自组件的请求,但我得到的响应似乎 100% 无效,我不知道出了什么问题。任何帮助/提示将不胜感激。
编辑:我的 setupServer 代码中的错字