【问题标题】:Mock a dependancy within a dependancy with Jest?用 Jest 模拟依赖项中的依赖项?
【发布时间】:2019-05-10 17:24:12
【问题描述】:

我需要测试这个功能:

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

jest.mock()的模块工厂不允许引用任何 范围外的变量。

【问题讨论】:

    标签: javascript unit-testing mocking jestjs


    【解决方案1】:

    你已经接近了!

    你需要在传递给jest.mock的模块工厂函数中移动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 的模块工厂函数必须是完全独立的。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2018-01-21
      • 2021-12-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-09-03
      • 2020-12-09
      • 2014-09-23
      相关资源
      最近更新 更多