使用Jest动态模拟依赖项

时间:2017-10-27 13:51:37

标签: node.js unit-testing jestjs

我有一种方法可以通过节点环境中的一个功能和浏览器环境中的不同功能记录消息。要检查我是否在节点或浏览器环境中,我使用库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(自动通过包),具体取决于我是在浏览器中还是在节点env中。

现在我想使用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在节点中运行,但第二个测试未能说

  

预期的模拟函数不被调用,但它被调用:   [“错误”,“测试记录器”,“消息”,[]]

1 个答案:

答案 0 :(得分:0)

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

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