Издеваться над зависимостью от Джеста? - PullRequest
2 голосов
/ 10 мая 2019

Мне нужно проверить эту функцию:

import dependency from 'dependency';

export default values => (dispatch) => {
  dispatch(dependency(values));
  // More code
};

Я получил тест, который утверждает, что dispatch называется dependency:

import functionToTest from 'function-to-test';

jest.mock('dependency', () => () => 'dependency res');

describe('functionToTest', () => {
    const dispatch = jest.fn();
    functionToTest({ foo: 'bar' })(dispatch);

    test('test', () => {
        expect(dispatch.mock.calls[0][0]).toBe('dependency res');
    });
});

Мне нужно утверждать, что dependancy был вызван с { foo: 'bar' }. Я попытался назвать мой макет зависимости, но когда я console.log это не определено:

import functionToTest from 'function-to-test';

const dependencyMock = jest.mock('dependency', () => () => 'dependency res');

describe('functionToTest', () => {
    const dispatch = jest.fn();
    functionToTest({ foo: 'bar' })(dispatch);

    test('test', () => {
        expect(dispatch.mock.calls[0][0]).toBe('dependency res');

        console.log(dependencyMock.mock.calls) // undefined
    });
});

Я попытался создать новую шутливую функцию spy, надеясь, что смогу проверить ее аргументы, но это вернуло ошибку

import functionToTest from 'function-to-test';

const spy = jest.fn(() => 'save-form-data');

const dependencyMock = jest.mock('dependency', () => spy);

describe('functionToTest', () => {
    const dispatch = jest.fn();
    functionToTest({ foo: 'bar' })(dispatch);

    test('test', () => {
        expect(dispatch.mock.calls[0][0]).toBe('dependency res');

        console.log(dependencyMock.mock.calls) // undefined
    });
});

Заводская фабрика jest.mock() не может ссылаться на любые переменные вне области видимости.

1 Ответ

1 голос
/ 11 мая 2019

Вы близки!

Вам нужно переместить функцию макета внутри фабричной функции модуля, переданную в jest.mock.

Затем вам просто нужно импортировать dependency в тести убедитесь, что он был вызван, как и ожидалось:

import functionToTest from 'function-to-test';
import dependency from 'dependency';  // <= dependency will be...

jest.mock('dependency', () =>
  jest.fn(() => 'dependency res')  // <= ...this mock function
);

describe('functionToTest', () => {
  it('should dispatch dependency', () => {
    const dispatch = jest.fn();
    functionToTest({ foo: 'bar' })(dispatch);

    expect(dispatch.mock.calls[0][0]).toBe('dependency res');  // Success!
    expect(dependency).toHaveBeenCalledWith({ foo: 'bar' });  // Success!
  });
});

Обратите внимание, что по умолчанию babel-jest поднимает jest.mock вызовы, и они выполняются раньше, чем что-либо еще в тестовом файле, поэтому функции фабрики модулей передаются в jest.mockдолжны быть полностью автономными.

...