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