开玩笑-模拟工厂功能

时间:2019-05-16 12:43:50

标签: 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);
  });
});

2 个答案:

答案 0 :(得分:2)

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

答案 1 :(得分:0)

您可以使用mockReturnValue(false)开玩笑地在测试中强制返回值。

因此,在您的代码中,它看起来像:

...
brake: jest.fn().mockReturnValue(false),
...

这里是the mockReturnValue() documentation