我正在使用 Jest 作为测试运行程序编写测试,尝试使用 Mock Server Library ( https://mswjs.io/ ) 来模拟服务器。出于某种原因,Jest 似乎没有等待 Axios 调用的承诺。
为了隔离他的问题,我创建了一个简单的示例:一个 Vue 组件,它向测试 api 触发 axios 发布请求,然后使用响应中的值更新模板。
<template>
<div data-testid="test-page">
<h1>Test Page</h1>
<div data-testId="result-div" v-if="result_id">RESULT {{ result_id }}</div>
<form>
<button @click.prevent="submitForm()">Test Axios</button>
</form>
</div>
</template>
<script>
import axios from 'axios';
export default {
data() {
return {
result_id: null
}
},
methods: {
submitForm() {
axios.post('https://jsonplaceholder.typicode.com/posts',{
title: 'foo 2',
body: 'bar 2',
userId: 2,
}).then(
(response) => {
this.result_id = response.data.id;
}
);
}
}
}
</script>
<style scoped></style>
jsonplaceholder.typicode.com 发布请求文档在此处描述: https ://jsonplaceholder.typicode.com/guide/
它返回此输出
{
id: 101,
title: 'foo 2',
body: 'bar 2',
userId: 2
}
因此,一旦返回响应并且“result_id”的值为 101,屏幕上就会出现“RESULT 101”。在浏览器中它可以完美运行。
但在 Jest 中却没有。这是失败的 Jest 测试:
import TestPage from './TestPage.vue';
import { render, screen } from '@testing-library/vue';
import "@testing-library/dom";
import "@testing-library/jest-dom"
import userEvent from '@testing-library/user-event';
import { setupServer } from 'msw/node'
import { rest } from "msw"
describe("Test Page", () => {
it("Tests axios", async () => {
const server = setupServer(
rest.post("https://jsonplaceholder.typicode.com/posts", (req, res, ctx) => {
return ctx.status(200);
})
);
server.listen();
render(TestPage);
const button = screen.queryByRole("button", { "name": "Test Axios" });
await userEvent.click(button);
await server.close();
const text = screen.queryByText("RESULT");
expect(text).toBeInTheDocument();
//const result_div = screen.queryByTestId("result-div");
//expect(result_div).toBeInTheDocument();
});
});
所以我使用 msw 模拟服务器并返回 200 状态,然后渲染页面,模拟按钮单击,并尝试查询包含“RESULT 101”的 div(使用 queryByText 或 queryByTestId),但 v-if指令永远不会被触发并且 'result_id' 没有被设置。因此,Jest 似乎没有等待 axios 承诺,并且“result_id”保持为空,而不是从响应中接收 101 值。
不确定我的代码是否有问题,或者是 Jest 甚至是 mswjs 错误。