在软件开发的过程中,测试的重要性就不用多说了。在测试中有些时候是需要和REST API进行交互的。但在调用网络服务的时候,可能会出现网络中断,服务器故障等各种情况,那么在Jest中该如何处理这些情况呢?答案就是使用Mock Object,下面介绍如何在Jest中使用Mock Object。

当不使用Mock Object时如何测试REST API
调用REST API的模块
const axios = require('axios');
async function getFirstPeopleName() {
const response = await axios.get('https://swapi.dev/api/people/1');
return response.data;
}
module.exports = getFirstPeopleName;
测试代码
const getFirstPeopleName = require("./getFirstPeopleName");
it("returns the name of the first people", async () => {
const luke = await getFirstPeopleName();
expect(luke.name).toEqual("Luke Skywalker");
});
使用Mock Object后的测试代码
const getFirstPeopleName = require("./getFirstPeopleName");
const axios = require("axios");
jest.mock("axios");
it("returns the name of the first people", async () => {
axios.get.mockResolvedValue({
data: {
name: "Luke Skywalker",
height: "172",
mass: "77",
},
});
const luke = await getFirstPeopleName();
expect(luke.name).toEqual("Luke Skywalker");
});
在上面代码中,最为重要的一行代码就是这里:jest.mock(‘axios’);。经过这个调用之后,Jest会替换掉Axios中的所有模块,其替换后的行为就是什么都不做,返回undefined。需要特别注意的是,经过这个调用后,就算在其他模块中调用axios,也同样会受到影响。
因此这时就需要实现自己的调用逻辑:
axios.get.mockResolvedValue({
data: {
name: "Luke Skywalker",
height: "172",
mass: "77",
},
});
经过这句话之后,axios模块的行为就会被彻底改变了,不会发出网络请求,而只是返回固定的对象。
更多细节请参考官网:https://jestjs.io/docs/mock-functions#mocking-modules