javascript - 使用 Jest 模拟依赖项中的依赖项?

标签 javascript unit-testing mocking jestjs

我需要测试这个功能:

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
    });
});

我尝试创建一个新的 Jest 函数 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
    });
});

The module factory of jest.mock() is not allowed to reference any out-of-scope variables.

最佳答案

你已经很接近了!

您需要将模拟函数移动到传递给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 必须完全独立。

关于javascript - 使用 Jest 模拟依赖项中的依赖项?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56082239/

相关文章:

unit-testing - 如何在Dart中对大量异步流程进行单元测试?

python - pytest 模拟 MongoReplicaSetClient 对象的 .count() 和 .find() 函数

mocking - robolectric 3.0 Mockito -- 如何在事件中模拟类

java - 调用 FileWriter 的单元测试方法

javascript - 如何在对象中重复对象的数组?

javascript - Promise 没有像我期望的那样表现

javascript - Angular-Ui Bootstrap Popup DatePicker 的 ngModelOptions 的时区属性

javascript - 监视传递给函数组合的所有参数

c# - 如何模拟 SerialDataReceivedEventArgs

javascript - 使用 JavaScript 进行 URL 验证/连接