Monday, May 20, 2024
102
rated 0 times [  109] [ 7]  / answers: 1 / hits: 5216  / 4 Years ago, sat, october 24, 2020, 12:00:00

I am trying my hand jest and writing unit tests.
I have written unit tests for couple of functions. These functions use an object of constants imported from a different file. So I have mocked these constants.


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);
});
});
});

But when the third test which is in the second describe block is running it is picking up the mocked values instead of the original values. I thought this beforeEach(() => jest.resetModules()); would reset the mocked values but it is not working.
Please help with this.
Any other tips for improving on the tests will be appreciated.


More From » unit-testing

 Answers
4

jest.resetModules only resets module cache and allows to reimport modules, it doesn't affect module mocks in effect:



Resets the module registry - the cache of all required modules. This is useful to isolate modules where local state might conflict between tests.



In order for module mock to be discarded, jest.unmock or jest.dontMock needs to be used. If a default behaviour for these tests is unmocked constants, this can be:


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

In this scenario it's easier to import original implementation at top level and use it in tests that need it:


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

And require a mock only in tests that need mocked implementation of helper or modules that it depends on (constants). beforeEach with jest.resetModules and jest.unmock is still desirable in order for these tests to not cross-contaminate each other, tests that use top-level helper won't be affected by it.


[#2429] Monday, October 19, 2020, 4 Years  [reply] [flag answer]
Only authorized users can answer the question. Please sign in first, or register a free account.
kaleyv

Total Points: 259
Total Questions: 99
Total Answers: 107

Location: Saint Helena
Member since Tue, Nov 3, 2020
4 Years ago
;