简体   繁体   中英

Jest mock always gives undefined (typescript + ts-jest)

I cannot seem to make mock work properly.

a bit of context :

    "jest": "^24.8.0",
    "ts-jest": "^24.0.2",
    "typescript": "^3.5.3"

  • storage.ts contains a method getOsTmpDir .

  • moduleA.ts is consuming storage.ts

  • in moduleA.spec.ts :

jest.mock('./storage', () => ({
    getOsTmpDir: jest.fn().mockImplementation(() => '/tmp'),
}));

printing (in console.log(getOsTmpDir()); give undefined

other things I've tried :

  • getOsTmpDir: jest.fn(() => '/tmp')
  • getOsTmpDir: jest.fn().mockReturnValue('/tmp')

but nothing seems to help. what am I missing?


Edit : I've found the issue. I didn't notice that all mocks were resetting before each test, and since I've defined the mocks at the top of the file (once), the mocks were terminated right before running any test

beforeEach(async () => { jest.resetAllMocks(); <---- .... }

How are you exporting/importing that method? This is what it should look like when mocking an exported function:

Defining the "real" function:

~fileA.ts
...

export function what() {
  console.log('A');
}
...

Test:

~test.ts
...

import { what } from './fileA';

jest.mock('./fileA', () => ({
    what: jest.fn().mockImplementation(() => console.log('B')),
}));

describe('mocks', () => {
  it('should work', () => {
    what();
  });
});
$ jest test.ts

...
console.log test.ts:9
    B

And you should see that the test called the mock implementation of what and logged a B.

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM