15

I'm trying to figure out manual mocks in Jest. I think this should be easy...but it isn't.

My project directories are like

  • __tests__
    • user-test.js
  • models
    • user.js
    • __mocks__
      • user.js
  • node_modules
    • ...
  • package.json

Both models/user.js and models/__mocks__/user.js have the same code:

module.exports = {
    create(username, password) {
        return new Promise(function(resolve, reject) {
            setTimeout(function() {
                resolve({"username":username, "password": password});
            }, 100);
        });
    }
}

The file __tests__/user-test.js looks like this:

test('user creation works', () => {
    const user = require('../models/user');
    //const user = jest.mock('../models/user');
    return user.create("mitchell", "boo");
});

This works fine, tests pass, but when I change it to:

test('user creation works', () => {
    //const user = require('../models/user');
    const user = jest.mock('../models/user');
    return user.create("mitchell", "boo");
});

It doesn't work, and spits out:

 FAIL  __tests__\user-test.js
  ● user creation works

    TypeError: user.create is not a function

      at Object.<anonymous>.test (__tests__\user-test.js:4:17)
      at process._tickCallback (internal\process\next_tick.js:103:7)

1 Answer 1

27

Ah! Figured it out! My folder structure is fine. Turns out I had a misunderstanding as to what "jest.mock" actually did. "jest.mock" changes the behavior of the node "require" function to use the mock, it doesn't do a require itself.

My test should have looked like:

jest.mock('../models/user');
test('user creation works', () => {
    const user = require('../models/user');
    return user.create("mitchell", "boo");
});
Sign up to request clarification or add additional context in comments.

1 Comment

Jest mock is used to prevent the functions in a module to be called when module is initialized or an object is instantiated, It is made this way to provide a good shield against other software layers that are not the target of the current unit test

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.