Skip to main content

[前端测试] Jest深入

通过测试类理解单元测试和集成测试

假设有个 util.js 文件里面是一个工具类, 该类里有很多复杂的方法

// util.js文件
class Util {
init() {}

a() {}

b() {}
}

export default Util;

如何对这个类的方法进行测试, 就创建一个测试文件比如 util.test.js 文件

// util.test.js文件
import Util from "./util";

const util = null;

beforeAll(() => {
util = new Util();
});

test("测试 util 类的a方法", () => {
expect(util.a(1, 2)).toBe("xxxx");
});

这个文件里引入 Util 类, 创建一个实例, 对实例方法执行, 看看结果. 就是这样测试

但是类中方法非常复杂, 为了节约性能, 我们可以模拟类

jest.mock("路径");
// 他会把类的构造函数和里面的方法都自动替换成jest.fn(), 转化成类似如下代码

const Util = jest.fn();
Util.a = jest.fn();
Util.b = jest.fn();

Jest 中对 DOM 节点操作的测试

我们创建一个 demo.js 文件, 这个文件有一个函数, 每次调用都使用 jquery 创建一个 div 标签插入到 body 中, 导出这个函数

// demo.js文件
import $ from "jquery";

const addDivToBody = () => {
$("body").append("<div />");
};

export default addDivToBody;

编写测试文件 demo.test.js 文件

// demo.test.js 文件
import addDivToBody from "./demo";
import $ from "jquery";

test("测试 addDivToBody", () => {
addDivToBody();
addDivToBody();

console.log($("body").find("div").length); // 2
});

使用 api 测试

import addDivToBody from "./demo";
import $ from "jquery";

test("测试 addDivToBody", () => {
addDivToBody();
addDivToBody();
expect($("body").find("div").length).toBe(2);
});

因为 jest 运行环境是 node 环境, node 环境没有 dom 这种东西. 但是为什么 jest 能够对 dom 进行操作? 因为 jest 在 node 环境中自己模拟了一套 dom 的 api. 也称作jsdom