Node.js 使用Jest动态模拟依赖项

Node.js 使用Jest动态模拟依赖项,node.js,unit-testing,jestjs,Node.js,Unit Testing,Jestjs,我有一种方法,可以在节点环境中通过一个函数记录消息,在浏览器环境中通过另一个函数记录消息。要检查我是否在节点或浏览器环境中,我使用库检测节点和是浏览器,如下所示: const isNode = require('detect-node'); const isBrowser = require('is-browser'); log(level, message, data) { if (isNode) { this.nodeTransport.log(level, thi

我有一种方法,可以在节点环境中通过一个函数记录消息,在浏览器环境中通过另一个函数记录消息。要检查我是否在节点或浏览器环境中,我使用库
检测节点
是浏览器
,如下所示:

const isNode = require('detect-node');
const isBrowser = require('is-browser');

log(level, message, data) {
    if (isNode) {
        this.nodeTransport.log(level, this.name, message, data);
    }
    if (isBrowser) {
        this.browserTransport.log(level, this.name, message, data);
    }
}
变量
isNode
isBrowser
设置为true和false(通过软件包自动设置),具体取决于我是在浏览器中还是在节点环境中

现在我想使用
jest
测试这个行为,所以我需要模拟这些npm包。这就是我所尝试的:

function setup() {
    const loggerName = 'Test Logger';
    const logger = new Logger(loggerName);
    logger.nodeTransport = { log: jest.fn() };
    logger.browserTransport = { log: jest.fn() };
    logger.splunkTransport = { log: jest.fn() };
    return { logger, loggerName };
}

test('it should call the the appropriate transports in a node environment', () => {
    const { logger } = setup();
    const message = 'message';
    jest.mock('detect-node', () => true);
    jest.mock('is-browser', () => false);
    logger.log('error', message, []);
    expect(logger.nodeTransport.log).toHaveBeenCalled();
    expect(logger.browserTransport.log).not.toHaveBeenCalled();
});

test('it should call the the appropriate transports in a browser environment', () => {
    const { logger } = setup();
    const message = 'message';
    jest.mock('detect-node', () => false);
    jest.mock('is-browser', () => true);
    logger.log('error', message, []);
    expect(logger.nodeTransport.log).not.toHaveBeenCalled();
    expect(logger.browserTransport.log).toHaveBeenCalled();
});
你看,我正在使用
jest.mock
来模拟
检测节点
是浏览器
,并给它不同的返回值。然而,这是行不通的。第一个测试是绿色的,因为(我假设)Jest在节点中运行,但第二个测试失败

预期不会调用模拟函数,但调用时使用了: [“错误”、“测试记录器”、“消息”、[]

用于重置测试之间的模拟调用

afterEach(() => {
    logger.nodeTransport.log.mockClear();
    logger.browserTransport.log.mockClear();
});