Jest макет асинхронной функции из импорта по умолчанию - PullRequest
0 голосов
/ 21 сентября 2018

Я пытаюсь смоделировать асинхронную функцию, которая экспортируется как экспорт по умолчанию, но все, что я получаю, это TypeError: Невозможно прочитать свойство 'then' из неопределенного

Что япытаюсь смоделировать это config.js :

const configureEnvironment = async (nativeConfig) => {
    return { await whatever() }
}

Файл, который я тестирую, Scene.js :

import configureEnvironment from './config';

class Scene extends React.Component {
    constructor(props) {
        nativeConfig = {};
        configureEnfironment(nativeConfig).then((config) => {
            // Do stuff
        }
    }
}

Имой тестовый файл Scene.test.js :

let getScene = null;
const configureEnvironmentMock = jest.fn();

describe('Scene', () => {
    jest.mock('./config', () => configureEnvironmentMock);

    const Scene = require('./Scene').default;

    getScene = (previousState) => {
        return shallow(
            <Scene prevState={previousState}>
                <Fragment />
            </Scene>,
        );
    };

    it('calls configureEnvironment with the nativeConfig', async () => {
        expect.assertions(1);
        const nativeConfig = {};

        getScene(nativeConfig);

        expect(configureEnvironmentMock).toHaveBeenCalledWith(nativeConfig);
    });
});

Однако результат выполнения теста:

TypeError: Cannot read property 'then' of undefined

Я понимаю, что проблема вкак я имитирую configureEnvironment, но я не могу заставить его работать.

Я также пытался насмехаться над такой функцией:

jest.mock('./config', () => {
    return {
        default: configureEnvironmentMock,
    };
});

Но это приводит к:

TypeError: (0 , _config2.default) is not a function

Ответы [ 2 ]

0 голосов
/ 26 февраля 2019

Вы можете подшутить над чем угодно, например: jest.mock('@material-ui/core/withWidth', () => ({ __esModule: true, isWidthUp: jest.fn((a, b) => true), default: jest.fn(fn => fn => fn) }))

0 голосов
/ 22 сентября 2018

Простой и понятный способ смоделировать экспорт модуля по умолчанию - использовать jest.spyOn в сочетании с такими функциями, как mockImplementation.


Вот рабочий пример, основанный на фрагментах кода выше:

config.js

const whatever = async () => 'result';

const configureEnvironment = async (nativeConfig) => await whatever();

export default configureEnvironment;

Scene.js

import * as React from 'react';
import configureEnvironment from './config';

export class Scene extends React.Component {
  constructor(props) {
    super(props);
    configureEnvironment(props.prevState).then((config) => {
      // Do stuff
    });
  }
  render() {
    return null;
  }
}

Scene.test.js

import React, { Fragment } from 'react';
import { shallow } from 'enzyme';

import { Scene } from './Scene';
import * as config from './config';

describe('Scene', () => {

  const mock = jest.spyOn(config, 'default'); // spy on the default export of config
  mock.mockImplementation(() => Promise.resolve('config')); // replace the implementation

  const getScene = (previousState) => {
    return shallow(
      <Scene prevState={previousState}>
        <Fragment />
      </Scene>,
    );
  };

  it('calls configureEnvironment with the nativeConfig', async () => {
    expect.assertions(1);
    const nativeConfig = {};

    getScene(nativeConfig);

    expect(mock).lastCalledWith(nativeConfig);  // SUCCESS
  });
});
...