javascript - Jest - 模拟工厂功能

标签 javascript jestjs

我要测试的函数是 createCarAndDrive(),它使用 Car 模块。我想模拟 Car 模块中的一个函数,因此不会调用它的实际函数,而是调用模拟函数。

因此,Car 函数返回两个函数 gas()brake()Car是使用工厂函数模式实现的。所以这两个函数被包装在 Car 中,并且在 Car 被调用之前不会被公开。

是否可以通过某种方式模拟函数 brake() 以返回 false

这是实现。

// Car.js
function Car({ name, model }) {
  function gas(speed) {
    return `${name} ${model} goes forward at a speed of ${speed}km/h`;
  }
  function brake() {
    return true;
  }

  return {
    gas,
    brake,
  };
}

// driver.js
function createCarAndDrive() {
  const car = Car({ name: 'Fiat', model: 'Punto' });
  car.gas(123);
  return car.brake();
}

// driver.test.js
describe('drive', () => {
  beforeEach(() => {
    // How to mock function inside a function?
    jest.mock('./Car', () => ({
      brake: jest.fn().mockImplementation(() => false),
    }));
  });

  test('it should not brake', () => {
    const itHitBreak = createCarAndDrive();
    expect(itHitBreak).toBe(false);
  });
});

最佳答案

jest.mock 工厂函数 don't work within test functions .

jest.mock 移动到测试的顶级范围,它应该可以工作:

import { createCarAndDrive } from './driver';

jest.mock('./Car', () => ({
  Car: () => ({
    gas: () => 'mock gas',
    brake: () => false
  })
}));

describe('drive', () => {
  test('it should not brake', () => {
    const itHitBreak = createCarAndDrive();
    expect(itHitBreak).toBe(false);  // Success!
  });
});

关于javascript - Jest - 模拟工厂功能,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56168888/

相关文章:

javascript - 如何检查字符串是否可能由机器人生成?

javascript - 如何使用 jQuery 提交表单然后重新加载页面

javascript - Jest css-modules SyntaxError : Unexpected token

javascript - 开 Jest 抛出 TyperError : Expected a function when using lodash pipe/flow

javascript - Jest - 在一个测试套件中多次测试模块

javascript - knockout js与datetimepicker绑定(bind)给出了一个异常

Javascript 文本扩展器

javascript - Nodejs 卡住 MySQL 大量结果输入 REDIS HMSET

typescript - 没有为 ts-jest 和 puppeteer 定义浏览器

reactjs - 使用 Jest with Enzyme 的 Typescript 测试无法识别组件