模拟:隔离代码进行测试
模拟允许您创建代码的虚拟替身,模拟其行为而不执行实际实现。这对于隔离代码进行测试非常有用,因为您可以控制模拟行为,而无需依赖外部依赖项或状态。
演示代码:
// 创建一个对 fetchData 函数的模拟
const mockFetchData = jest.fn().mockResolvedValue(data);
// 使用模拟的 fetchData 函数进行测试
it("should fetch data from API", async () => {
const result = await fetchApi();
expect(result).toEqual(data);
expect(mockFetchData).toHaveBeenCalledTimes(1);
});
细化:验证函数调用
细化通过检查函数调用来验证代码的行为。这可用于确保函数已按预期调用,包括参数和执行顺序。
演示代码:
// 创建一个对 fetchData 函数的细化
const spyFetchData = jest.spyOn(api, "fetchData");
// 使用细化的 fetchData 函数进行测试
it("should call fetchData with correct parameters", () => {
fetchApi();
expect(spyFetchData).toHaveBeenCalledWith(10, "foo");
});
模拟与细化的结合
模拟和细化可以结合使用以创建强大的测试策略。您可以模拟外部依赖项,同时细化内部函数调用以验证代码的行为。
演示代码:
// 创建一个对 fetchData 函数的模拟
const mockFetchData = jest.fn().mockResolvedValue(data);
// 创建一个对 api.fetchData 函数的细化
const spyApiFetchData = jest.spyOn(api, "fetchData");
// 使用模拟和细化的 fetchData 函数进行测试
it("should fetch data and call api.fetchData", async () => {
const result = await fetchApi();
expect(result).toEqual(data);
expect(mockFetchData).toHaveBeenCalledTimes(1);
expect(spyApiFetchData).toHaveBeenCalledWith(10, "foo");
});
优点:
- 隔离:模拟可将测试与外部依赖项和状态隔离开来。
- 可预测性:模拟可确保测试在每次运行时具有可预测的结果。
- 覆盖范围:细化可帮助验证函数调用,提高测试覆盖率。
- 可靠性:通过隔离和验证代码行为,模拟和细化测试可提高代码的可靠性。
结论:
Jest 提供的模拟和细化测试功能对于编写高质量、可靠的 JavaScript 代码至关重要。通过模拟和细化代码行为,开发人员可以隔离依赖项、验证函数调用并提高测试覆盖率,从而提高代码的质量并减少错误。