我有一个我想测试的功能,这个功能使用导入的模块:
var a = require('./a');
function add(b) {
return a + b;
}
module.exports = add;
a
模块在此示例中返回一个数字,但在我的实际项目中,我将其用作手动更改的配置对象。
var a = 1;
module.exports = a;
add
函数的测试如下所示:
describe('add', () => {
it('should add the mock number 1 to 2', () => {
jest.setMock('./a', 1);
const add = require('./add');
expect(add(2)).toBe(3);
});
it('should add the mock number 2 to 2', () => {
jest.setMock('./a', 2);
const add = require('./add');
expect(add(2)).toBe(4);
});
});
第一次测试通过,第二次测试失败,因为它继承自第一个模拟。有没有办法多次模拟a
模块?
我想要一个解决方案并不意味着重构add
函数,而是专注于多次模拟该模块。 (在我的真实项目中是配置文件)
您可以在此处使用代码:https://repl.it/@adyz/NocturnalBadComma
答案 0 :(得分:4)
添加
beforeEach(() => {
jest.resetModules();
});
最终测试
describe('add', () => {
beforeEach(() => {
jest.resetModules();
});
it('should add the mock number 5 to 2', () => {
jest.setMock('./a', 5);
const add = require('./add');
expect(add(2)).toBe(7);
});
it('should add the mock number 2 to 2', () => {
jest.setMock('./a', 2);
const add = require('./add');
expect(add(2)).toBe(4);
});
});
答案 1 :(得分:0)
要添加到@Gigi的解决方案中,我使用jest.mock创建了另一个示例:
在文件multiplier.ts中,multiplier
是我们要测试的导出函数:
// file: multiplier.ts
import {getNumber} from './get-number'
const multiplier = (num:number) => num * getNumber()
export {multiplier}
在文件get-number.ts中,getNumber
是我们要模拟的模块:
// file: get-number.ts
const getNumber = () => 2
export {getNumber}
这是测试:
// file: multiplier.test.ts
// import { multiplier } from "./multiplier" // <-- this will not work
describe("[multiplier]", () => {
beforeEach(() => {
jest.resetModules()
})
it('should mock getNumber so that getNumber return 3', () => {
const mockReturn = 3
jest.mock( './get-number', () => (
{ getNumber: jest.fn(()=>mockReturn) }
))
const { multiplier } = require('./multiplier')
expect(multiplier(2)).toBe(6)
})
it('should mock getNumber so that getNumber return 4', () => {
const mockReturn = 4
jest.mock( './get-number', () => (
{ getNumber: jest.fn(()=>mockReturn) }
))
const { multiplier } = require('./multiplier')
expect(multiplier(2)).toBe(8)
})
it('should mock getNumber so that getNumber return 5', () => {
const mockReturn = 5
jest.mock( './get-number', () => (
{ getNumber: jest.fn(()=>mockReturn) }
))
const { multiplier } = require('./multiplier')
expect(multiplier(2)).toBe(10)
})
})
注意:要执行此操作,我们需要使用require导入multiplier.ts