我的React Native项目中的一些测试会影响全局对象。这些更改通常会影响依赖于相同对象的其他测试。
例如:一个测试检查是否正确添加了侦听器,第二个测试检查是否正确删除了侦听器:
// __tests__/ExampleClass.js
describe("ExampleClass", () => {
it("should add listeners", () => {
ExampleClass.addListener(jest.fn());
ExampleClass.addListener(jest.fn());
expect(ExampleClass.listeners.length).toBe(2);
});
it("should remove listeners", () => {
const fn1 = jest.fn();
const fn2 = jest.fn();
ExampleClass.addListener(fn1);
ExampleClass.addListener(fn2);
expect(ExampleClass.listeners.length).toBe(2);
ExampleClass.removeListener(fn1);
expect(ExampleClass.listeners.length).toBe(1);
ExampleClass.removeListener(fn2);
expect(ExampleClass.listeners.length).toBe(0);
});
});
第二个测试本身运行正常,但在运行所有测试时失败,因为第一个测试没有清理ExampleClass。在每次测试中,我是否总是需要手动清理这样的东西?
似乎我不理解范围在Jest中是如何工作的......我假设每个测试都在新环境中运行。有没有关于此的文件?
其他示例是模拟外部库并检查它们中的模拟函数是否被正确调用,或者是否覆盖{i}或android以测试特定于平台的实现。
答案 0 :(得分:2)
据我所知,测试的范围始终是测试文件。现在,我将代码更改为beforeEach
回调,主要调用jest.resetAllMocks()
并将Platform.OS
重置为其默认值。
快速沙盒
Jest将测试运行并行化,以最大限度地提高性能。控制台消息被缓冲并与测试结果一起打印。每个测试的沙盒测试文件和自动全局状态重置,因此没有两个测试相互冲突。