我要测试的功能是使用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);
});
});
答案 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),
...