如何在Jest中重置模拟值?

时间:2020-10-24 15:43:37

标签: javascript unit-testing jestjs mocking

我正在开玩笑并编写单元测试。 我已经编写了一些功能的单元测试。这些函数使用从其他文件导入的常量对象。所以我嘲笑了这些常量。

describe('testing helpers', () => {

    beforeEach(() => jest.resetModules());

    describe('reset board', () => {
        // first test using original constant values
        test('with default constants', () => {
            const game = {
                board: [
                    [0, 0, 0, 0, 0, 0, 0],
                    [0, 0, 0, 0, 0, 0, 0],
                    [0, 0, 0, 0, 0, 0, 0],
                    [0, 0, 0, 0, 0, 0, 0],
                    [0, 0, 0, 0, 0, 0, 0],
                    [0, 0, 0, 0, 0, 0, 0]
                ],
                count: 0
            };

            const helper = require('./helper');
            expect(helper.resetBoard()).toEqual(game);
        });

        // second test using mocked constant values
        test('reset board', () => {
            const game = {
                board: [
                    [0, 0, 0, 0, 0],
                    [0, 0, 0, 0, 0],
                    [0, 0, 0, 0, 0],
                    [0, 0, 0, 0, 0]
                ],
                count: 0
            };  

            jest.mock("./constants", () => ({ ROWS: 4, COLUMNS: 5 }));

            const helper = require('./helper');
            expect(helper.resetBoard()).toEqual(game);
        });
    });

    describe('make move', () => {
        // third test with original constant values
        test('player 1 move', () => {

            const testBoard = [
                    [0, 0, 0, 0, 0, 0, 0],
                    [0, 0, 0, 0, 0, 0, 0],
                    [0, 0, 0, 0, 0, 0, 0],
                    [0, 0, 0, 0, 0, 0, 0],
                    [0, 0, 0, 0, 0, 0, 0],
                    [0, 0, 0, 0, 0, 0, 0]
                ];
            const testTurn = 'YELLOW';
            const testColumn = 0;

            const expectedBoard = [
                    [0, 0, 0, 0, 0, 0, 0],
                    [0, 0, 0, 0, 0, 0, 0],
                    [0, 0, 0, 0, 0, 0, 0],
                    [0, 0, 0, 0, 0, 0, 0],
                    [0, 0, 0, 0, 0, 0, 0],
                    [1, 0, 0, 0, 0, 0, 0]
                ];

            const helper = require('./helper');
            helper.makeMove(testBoard, testTurn, testColumn);
            expect(testBoard).toEqual(expectedBoard);
        });
    });
});

但是,当第二个describe块中的第三个测试正在运行时,它将获取模拟值而不是原始值。我以为这个beforeEach(() => jest.resetModules());会重置模拟值,但是不起作用。 请帮忙。 任何其他改进测试的技巧将不胜感激。

2 个答案:

答案 0 :(得分:1)

jest.resetModules仅重置模块缓存并允许重新导入模块,而不会影响有效的模块模拟​​:

重置模块注册表-所有必需模块的缓存。这对于隔离测试之间本地状态可能冲突的模块很有用。

为了丢弃模块模拟,需要使用jest.unmockjest.dontMock。如果这些测试的默认行为是未模拟constants,则可能是:

beforeEach(() => {
  jest.unmock("./constants");
  jest.resetModules();
});

在这种情况下,更容易在顶层导入原始实现并在需要它的测试中使用它:

const helper = require('./helper');
...

require仅在需要helper或依赖它的模块(constants的模块的模拟实现的测试中使用。为了使这些测试不会相互交叉污染,仍然希望将beforeEachjest.resetModulesjest.unmock进行交互,使用顶级helper的测试不会受到以下影响它。

答案 1 :(得分:0)

这可以解决。

describe('testing helpers', () => {
    beforeEach(() => jest.clearAllMocks());
    ....
})

如果使用jest + @testing-library/react

import { cleanup } from '@testing-library/react'

beforeEach(cleanup)