web-dev-qa-db-ja.com

各テストでjestモック関数の戻り値を変更する方法は?

コンポーネントテストファイルにこのようなモックモジュールがあります

  jest.mock('../../../magic/index', () => ({
    navigationEnabled: () => true,
    guidanceEnabled: () => true
  }));

これらの関数は、コンポーネントのレンダリング関数で呼び出され、特定の機能を非表示および表示します。

これらのモック関数の戻り値のさまざまな組み合わせのスナップショットを撮りたいです。

私はこのようなテストケースを持っているとします

 it('RowListItem should not render navigation and guidance options', () => {
    const wrapper = shallow(
      <RowListItem type="regularList" {...props} />
    );
    expect(enzymeToJson(wrapper)).toMatchSnapshot();
  });

このテストケースを実行するには、モックモジュール関数の戻り値をfalseに動的に変更します

jest.mock('../../../magic/index', () => ({
    navigationEnabled: () => false,
    guidanceEnabled: () => false
  }));

RowListItemコンポーネントを既に1回インポートしているため、モックモジュールは再びインポートしません。変わらないどうすればこれを解決できますか?

28
pashaplus

モジュールをモックして、スパイを返し、テストにインポートできます。

import {navigationEnabled, guidanceEnabled} from '../../../magic/index'

jest.mock('../../../magic/index', () => ({
    navigationEnabled: jest.fn(),
    guidanceEnabled: jest.fn()
}));

その後、mockImplementationを使用して実際の実装を変更できます

navigationEnabled.mockImplementation(()=> true)
//or
navigationEnabled.mockReturnValueOnce(true);

そして次のテストで

navigationEnabled.mockImplementation(()=> false)
//or
navigationEnabled.mockReturnValueOnce(false);
46

あなたがやりたいことは

import { navigationEnabled, guidanceEnabled } from '../../../magic/index';   

jest.mock('../../../magic/index', () => ({
  navigationEnabled: jest.fn(),
  guidanceEnabled: jest.fn()
}));

describe('test suite', () => {
  it('every test', () => {
    navigationEnabled.mockReturnValueOnce(value);
    guidanceEnabled.mockReturnValueOnce(value);
  });
});

これらの関数の詳細については、こちらをご覧ください=> https://facebook.github.io/jest/docs/mock-functions.html#mock-return-values

7

受け入れられた答えを得るのに苦労しました-navigationEnabledguidanceEnabledに相当するものは、それらに対してmockReturnValueOnceを呼び出そうとしたときに未定義でした。

ここに私がしなければならなかったことがあります:

../../../magic/__mocks__/index.js ::

export const navigationEnabled = jest.fn();
export const guidanceEnabled = jest.fn();

index.test.jsファイル内:

jest.mock('../../../magic/index');
import { navigationEnabled, guidanceEnabled } from '../../../magic/index';
import { functionThatReturnsValueOfNavigationEnabled } from 'moduleToTest';

it('is able to mock', () => {
  navigationEnabled.mockReturnValueOnce(true);
  guidanceEnabled.mockReturnValueOnce(true);
  expect(functionThatReturnsValueOfNavigationEnabled()).toBe(true);
});
2
Cass