Jest测试教程之四:在Jest中使用Mock Object


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

Jest

当不使用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


文章作者: 逻思
版权声明: 本博客所有文章除特別声明外,均采用 CC BY-NC-ND 4.0 许可协议。转载请注明来源 逻思 !
  目录