我要测试的函数是 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/