【问题标题】:Is it possible to mock inner function call?是否可以模拟内部函数调用?
【发布时间】:2022-01-24 16:09:30
【问题描述】:

假设我有一个模块如下:

// utils.ts
function innerFunction() {
  return 28;
}

function testing() {
  return innerFunction();
}

export {testing}

我想编写一个单元测试来测试testing 并模拟innerFunction 的返回值,期望任何对innerFunction 的调用都会解析为某个值,如下所示:

jest.mock('../utils', () => {
  const originalModule = jest.requireActual('../utils');

  return {
    // __esModule: true,
    ...originalModule,
    innerFunction: jest.fn().mockReturnValue(33),
  };
});

import { testing } from '../utils';

  it('should be okay', () => {
    expect(testing()).toBe(33);
  });

我原以为jest.requireActual 将能够读取所有函数,而innerFunction: jest.fn().mockReturnValue(33) 实际上会导致任何innerFunction 调用只返回33 作为值,但从上面的小实验看来,这不是案例。

在实际调用中 innerFunction 将返回 28,但在 Jest 环境中我希望 innerFunction 能够解析为我想要的任何值

【问题讨论】:

标签: javascript typescript jestjs


【解决方案1】:

选项 1

尝试将 innerFunction 作为 testing

的依赖项传递

utils.ts

function testing(innerFunction: () => number)  {
  return () => innerFunction();
}

export {testing}

test.ts

import { testing } from '../utils'  
  it('should be okay', () => {
    const mock = () => 33

    // AKA System under test
    const sut = testing(mock)

    expect(sut()).toBe(33);
  });

没有玩笑,测试可以更简单,也更可预测......

选项 2

innerFunction 移动到另一个文件,并使用 jest.mock

innerFunction.ts

export function innerFunction()  {
      return 33
}

utils.ts

import { innerFunction } from './innerFunction.ts'

function testing()  {
    return innerFunction();
}

export { testing }

test.ts

jest.mock('./innerFunction', () => {
  return () => 33
});

import { testing } from '../utils'

  it('should be okay', () => {
    expect(testing()).toBe(33);
  });

【讨论】:

  • 还有一个选项,你应该将“innerFunction”移动到另一个文件并使用jest.mock导入“innerFunction”
猜你喜欢
  • 2021-10-31
  • 1970-01-01
  • 1970-01-01
  • 2018-08-01
  • 2019-10-19
  • 2017-12-08
  • 2018-10-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多