如何处理影响Jest中其他测试的全局对象/测试

时间:2017-04-18 14:42:00

标签: javascript unit-testing jestjs

我的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以测试特定于平台的实现。

1 个答案:

答案 0 :(得分:2)

据我所知,测试的范围始终是测试文件。现在,我将代码更改为beforeEach回调,主要调用jest.resetAllMocks()并将Platform.OS重置为其默认值。

  

快速沙盒

     

Jest将测试运行并行化,以最大限度地提高性能。控制台消息被缓冲并与测试结果一起打印。每个测试的沙盒测试文件和自动全局状态重置,因此没有两个测试相互冲突。

     

https://facebook.github.io/jest/