我axios-mock-adapter
用来模拟我的 API,它可以正常工作,但在一个模拟中它返回 404 错误,我找不到原因。
这里有带测试的沙箱,你可以看到当我们运行测试时,第二次检查失败,因为axios POST
调用没有被模拟。我试图删除标题部分,但是当我运行测试时沙箱刚刚崩溃。
API 模拟(测试部分):
import axios from "axios";
import MockAdapter from 'axios-mock-adapter';
import Utils from "../Utils/Utils";
// Global variable for post request with axios
global.users_post = axios.create({
baseURL: "http://localhost:5000/api/",
headers: {'Content-Type': 'application/json'}
});
/* Mockup API */
var userMock = new MockAdapter(users_post);
const user_resp_full = {
data: {
first_name: "Test",
last_name: "Test",
email: "test@gmail.com",
address: "Test",
zipcode: 1010,
city: "Test",
admin: false
}
}
const testAPI = () => {
userMock
.onPost("users", user_resp_full, Utils.getAuth())
.reply(200, {data: {status: "success"}});
}
test("something", async () => {
let tree = shallow(<UserManage type="create" uuid="" />);
testAPI();
await flushPromises();
// Some test
tree.find("#confirm-create").simulate("click");
await flushPromises();
// Error 404, mock isn't trigger
})
我已经检查过了,数据相同,端点相同,但似乎没有正确模拟它。
axios在课堂上调用:
function (fields) {
users_post.post("users", fields, Utils.getAuth())
.then(resp => {
let data = resp.data;
// Do something
})
.catch(resp => {
let data = resp.response.data;
// Display error
});
}
此时,在我的 Jest 测试中,它返回 404 错误,因此它没有模拟我的端点 API(其他工作)。
该Utils.getAuth()
函数返回带有身份验证令牌的标头。
数据发送
这涉及数据发送的内容(首先是在使用mock的测试调用之前,其次是在测试的函数中,数据日志是发送到api的数据):
console.log src/tests/UserManage.test.js:222
POST USER 2
{"first_name":"Test","last_name":"Test","email":"test@gmail.com","address":"Test","zipcode":1010,"city":"Test","admin":false}
console.log src/Components/Users/UserManage.js:152
POST USER
console.log src/Components/Users/UserManage.js:153
{"first_name":"Test","last_name":"Test","email":"test@gmail.com","address":"Test","zipcode":1010,"city":"Test","admin":false}
更新
仅当我使用POST
带有以下标头的请求时才会发生此错误:
axios.post("http://localhost/api/user/update", {name: "Test"}, {headers: {"Authorization": "Bearer token")}});
我在 axios-mock-adapter github 测试页面上看到,最终我们应该headers
在没有标签的情况下进行测试:
{headers: {Autorization: "Bearer token"}}
become{Autorization: "Bearer token"}
但不幸的是,它并没有比我更好地工作。
解决方案
根据 Matt Carlotta 和他的代码框的响应,我用 2 个固定问题示例修改了我的:
POST
使用 axios*进行请求模拟测试POST
使用 axios* 实例的请求模拟测试
* 和axios-mock-adapter