自动化测试(四)031-js测试框架Jest——Mock与Spy之Mock函数提供三种特性-捕获函数调用情况、设置函数返回值、改变函数的内部实现

自动化测试(四)031-js测试框架Jest——Mock与Spy之Mock函数提供三种特性-捕获函数调用情况、设置函数返回值、改变函数的内部实现

Mock与Spy

mock测试就是在测试过程中,对于某些不容易构造或者不容易获取的对象,用一个虚拟的对象来创建以便测试的测试方法。

Mock 是单元测试中经常使用的一种技术。单元测试,顾名思义测试的重点是某个具体单元。但是在实际代码中,代码与代码之间,模块与模块之间总是会存在着相互引用。这个时候,剥离出这种单元的依赖,让测试更加独立,使用到的技术就是 Mock。

为什么要使用Mock函数?

在项目中,一个模块的方法内常常会去调用另外一个模块的方法。在单元测试中,我们可能并不需要关心内部调用的方法的执行过程和结果,只想知道它是否被正确调用即可,甚至会指定该函数的返回值。此时,使用Mock函数是十分有必要。

Mock函数提供的以下三种特性,在我们写测试代码时十分有用:

  • 捕获函数调用情况
  • 设置函数返回值
  • 改变函数的内部实现

自动化测试(四)031-js测试框架Jest——Mock与Spy之Mock函数提供三种特性-捕获函数调用情况、设置函数返回值、改变函数的内部实现

举个例子:

// math.js-文件一
export const getFooResult = () => {
  // foo logic here
};
export const getBarResult = () => {
  // bar logic here
};

// caculate.js-文件二
import { getFooResult, getBarResult } from "./math";

export const getFooBarResult = () => getFooResult() + getBarResult();

此时,getFooResult() 和 getBarResult() 就是 getFooBarResult 这个函数的依赖。如果我们关注的点是 getFooBarResult 这个函数,我们就应该把 getFooResult 和 getBarResult Mock 掉,剥离这种依赖。下面是一个使用 Jest 进行 Mock 的例子。

jest.fn()是创建Mock函数最简单的方式,如果没有定义函数内部的实现,jest.fn()会返回undefined作为返回值。

项目案例的主文件夹DEMO下,test文件夹里,新建mock.test.js文件

test/mock.test.js

test('测试jest.fn()调用', () => {
  let mockFn = jest.fn();
  let result = mockFn(1, 2, 3);

  // 断言mockFn的执行后返回undefined
  expect(result).toBeUndefined();
  // 断言mockFn被调用
  expect(mockFn).toBeCalled();
  // 断言mockFn被调用了一次
  expect(mockFn).toBeCalledTimes(1);
  // 断言mockFn传入的参数为1, 2, 3
  expect(mockFn).toHaveBeenCalledWith(1, 2, 3);
})

在DEMO的终端窗口,输入指令

npx jest text/mock.test.js

回车,显示执行测试成功

自动化测试(四)031-js测试框架Jest——Mock与Spy之Mock函数提供三种特性-捕获函数调用情况、设置函数返回值、改变函数的内部实现

上一篇:Spring面试专题


下一篇:Vue mock