Typescript 说笑,如何仅在特定测试中模拟外部模块?

Typescript 说笑,如何仅在特定测试中模拟外部模块?,typescript,unit-testing,mocking,jestjs,Typescript,Unit Testing,Mocking,Jestjs,我将Jest与TypeScript一起使用(使用tsjest)。这是我使用dotenv库的测试主题: import*作为dotenv从'dotenv'导入; 导出类TestSubject{ 公共功能测试(){ console.log(dotenv);//这里我调试是否使用模拟 } } 我只想为特定的测试模拟dotenv库,但我被卡住了 这是我的测试套件: 从“/TestSubject”导入{TestSubject}; 从“dotenv”导入*作为dotenv; jest.mock('doten

我将Jest与TypeScript一起使用(使用
tsjest
)。这是我使用
dotenv
库的测试主题:

import*作为dotenv从'dotenv'导入;
导出类TestSubject{
公共功能测试(){
console.log(dotenv);//这里我调试是否使用模拟
}
}
我只想为特定的测试模拟
dotenv
库,但我被卡住了

这是我的测试套件:

从“/TestSubject”导入{TestSubject};
从“dotenv”导入*作为dotenv;
jest.mock('dotenv');//把它放在这里,否则就不行了
描述('suite1',()=>{
它('测试1',()=>{
//我想在这里使用mock…它很有效
const subject=新的TestSubject();
subject.test();//显示我正在使用模拟
});
它('测试2',()=>{
//我不想在这里模仿
jest.dontMock('dotenv');//不起作用
jest.unmack('dotenv');//不起作用
const subject=新的TestSubject();
subject.test();//显示我仍在使用mock!!!
});
});
正如您所看到的,调用
jest.mock('dotenv')
应该放在descripe之外,否则它就不起作用了

我试图在测试2中不使用模拟,但它不起作用:
console.log
显示我正在使用模拟。

以下是解决方案:

index.ts
,将测试该文件:

import*作为dotenv从'dotenv'导入;
导出类TestSubject{
公开考试(){
console.log(dotenv);
}
}
单元测试:

description('TestSubject',()=>{
在每个之前(()=>{
jest.reset模块();
});
它('should mock dotenv',()=>{
开玩笑的多莫克(dotenv);
const dotenv=require('dotenv');
const{TestSubject}=require('./');
const subject=新的TestSubject();
subject.test();
expect(jest.isMockFunction(dotenv.config)).toBeTruthy();
});
它('不应该模仿dotenv',()=>{
开玩笑的unmack(“dotenv”);
const dotenv=require('dotenv');
const{TestSubject}=require('./');
const subject=新的TestSubject();
subject.test();
expect(jest.isMockFunction(dotenv.config)).toBeFalsy();
});
});
单元测试结果:

PASS src/stackoverflow/56446543/index.spec.ts
测试对象
✓ 应模拟dotenv(2111ms)
✓ 不应模拟dotenv(2ms)
console.log src/stackoverflow/56446543/index.ts:5
{config:
{[函数:配置]
_isMockFunction:true,
getMockImplementation:[函数],
mock:[Getter/Setter],
mockClear:[函数],
mockReset:[函数],
mockRestore:[函数],
mockReturnValueOnce:[函数],
mockResolvedValueOnce:[函数],
mockRejectedValueOnce:[函数],
mockReturnValue:[函数],
mockResolvedValue:[函数],
mockRejectedValue:[函数],
mockImplementationOnce:[函数],
mockImplementation:[函数],
mockReturnThis:[函数],
mockName:[函数],
getMockName:[函数]},
解析:
{[函数:解析]
_isMockFunction:true,
getMockImplementation:[函数],
mock:[Getter/Setter],
mockClear:[函数],
mockReset:[函数],
mockRestore:[函数],
mockReturnValueOnce:[函数],
mockResolvedValueOnce:[函数],
mockRejectedValueOnce:[函数],
mockReturnValue:[函数],
mockResolvedValue:[函数],
mockRejectedValue:[函数],
mockImplementationOnce:[函数],
mockImplementation:[函数],
mockReturnThis:[函数],
mockName:[函数],
getMockName:[函数]},
违约:
{config:
{[函数:配置]
_isMockFunction:true,
getMockImplementation:[函数],
mock:[Getter/Setter],
mockClear:[函数],
mockReset:[函数],
mockRestore:[函数],
mockReturnValueOnce:[函数],
mockResolvedValueOnce:[函数],
mockRejectedValueOnce:[函数],
mockReturnValue:[函数],
mockResolvedValue:[函数],
mockRejectedValue:[函数],
mockImplementationOnce:[函数],
mockImplementation:[函数],
mockReturnThis:[函数],
mockName:[函数],
getMockName:[函数]},
解析:
{[函数:解析]
_isMockFunction:true,
getMockImplementation:[函数],
mock:[Getter/Setter],
mockClear:[函数],
mockReset:[函数],
mockRestore:[函数],
mockReturnValueOnce:[函数],
mockResolvedValueOnce:[函数],
mockRejectedValueOnce:[函数],
mockReturnValue:[函数],
mockResolvedValue:[函数],
mockRejectedValue:[函数],
mockImplementationOnce:[函数],
mockImplementation:[函数],
mockReturnThis:[函数],
mockName:[函数],
getMockName:[函数]}}
console.log src/stackoverflow/56446543/index.ts:5
{config:[函数:config],
parse:[函数:parse],
默认值:{config:[Function:config],parse:[Function:parse]}
测试套件:1个通过,共1个
测试:2次通过,共2次
快照:共0个
时间:3.394s,预计4s
如您所见,
dotenv
模块对于第一个测试用例是模拟的,而对于第二个测试用例不是模拟的


您可以在这里找到完整的演示:

对@slideshowp2解决方案的改进

使用
jest.domock
时,需要在模块()之后调用
require
,但是

import * as summer from './exampleModule';

describe('mock vs no-mock', () => {
    beforeEach(() => {
        jest.resetModules();
    });

    it('NO-MOCKED', async () => {
        console.log(summer.sum(1, 1));
        expect(summer.sum(1, 1)).toBe(2);
    });
    it('MOCKED', async () => {
        jest.doMock('./exampleModule');
        const summer = await import('./exampleModule');

        const mockedSummer = mocked(summer, true);
        mockedSummer.sum.mockImplementation((a, b) => a + b + 1);
        console.log(summer.sum(1, 1));
        expect(summer.sum(1, 1)).toBe(3);
    });
    it('NO-MOCKED', async () => {
        console.log(summer.sum(1, 1));
        expect(summer.sum(1, 1)).toBe(2);
    });
});