【问题标题】:Dynamically mock dependencies with Jest使用 Jest 动态模拟依赖关系
【发布时间】:2018-04-09 03:45:37
【问题描述】:

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

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);
    }
}

变量isNodeisBrowser 设置为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 来模拟 detect-nodeis-browser 并给它不同的返回值。然而,这只是行不通。第一个测试是绿色的,因为(我假设)Jest 在节点中运行,但是第二个测试失败了

预期的模拟函数不会被调用,但它是通过以下方式调用的: [“错误”,“测试记录器”,“消息”,[]]

【问题讨论】:

    标签: node.js unit-testing jestjs


    【解决方案1】:

    使用.mockClear() 重置测试之间的模拟调用。

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

    【讨论】:

      猜你喜欢
      • 2020-09-03
      • 2018-07-23
      • 1970-01-01
      • 1970-01-01
      • 2019-04-04
      • 2020-01-11
      • 1970-01-01
      • 2017-11-23
      • 2017-04-29
      相关资源
      最近更新 更多