web-dev-qa-db-ja.com

別のファイルから関数をモックする-Jest

アプリケーションのユニットテストケースを作成しています。 Utilsセクションに記述され、すべてのファイルで使用される関数が1つあります。必要なときにこのUtils関数をモックしたかったのですが、できません。

コードのセットアップは次のとおりです。

Utils.js

> const getData = (name) => "Hello !!! " + name;
> 
> const getContact = ()=> return Contacts.mobile;
> 
> export {
>     getData,
>     getContact }

Login.js(Utils.jsを使用)

    const welcomeMessage = (name) => {

    return getData(name);
    }

私のテストファイル(Login.spec.js)

import { getData } from '../../src/utils';


jest.mock('getData', () => jest.fn())


describe('User actions', () => {

    it('should get username', () => {
        const value = 'Hello !!! Jest';
        expect(welcomeMessage('Jest')).toEqual(value);
    });

});

テストケースを実行すると、次のエラーが表示されます。

 Cannot find module 'getData' from 'Login.spec.js'

公式のJestドキュメンテーションとSOでも解決策を見つけようとしましたが、何も見つかりませんでした。このエラーを修正してこの関数をモックすることはできません。

7
Dalvik

jest.mock(...)の最初の引数はモジュールパスでなければなりません:

_jest.mock('../../src/utils');
_

utilsモジュールはコードであり、3番目のライブラリではないため、jestの手動モックを学ぶ必要があります。 https://facebook.github.io/jest/docs/en/manual-mocks .html

このファイルがある場合:_src/utils.js_

ファイルを作成することでそれをモックできます:_src/__mocks__/utils.js_

このファイルの内容はオリジナルの複製ですが、実装をgetData = jest.fn()で置き換えます

ファイルをテストするには、ファイルの先頭でjest.mock('../../src/utils');を呼び出すだけです。

慣れてきたら、その関数をbeforeEach()内で呼び出し、そのカウンターjest.unmock('../../src/utils'); insider afterEach()を呼び出すことができます

それについて考える簡単な方法は、次のとおりです。

jest.mock('../../src/utils');を呼び出すとき、それはjestに次のことを伝えることを意味します。

実行中のテストがrequire('../../src/utils')の行に一致する場合は、ロードしないで、_../../src/__mocks__/utils_をロードしてください。

16
Khoa

別のソリューションは、次のようなことを行うことでこれを偽造します。

window['getData'] = jest.fn();
1
Dan