使用 Jest 在 Node-RED 中对自定义节点进行单元测试时出现 setTimeout 错误
setTimeout error when unit testing a custom node in Node-RED using Jest
我注意到一般情况下,在 Node-RED 中测试自定义节点并不是使用 Jest 完成的 - 我不认为有什么特别的原因,但这是我最熟悉的,所以我正在尝试无论如何。
我的测试设置看起来像
const n = require('../src/index.js');
describe('custom node', () => {
const nodeType = 'custom node';
beforeAll(done => {
helper.startServer(done);
});
afterEach(() => {
helper.unload();
});
afterAll(done => {
helper.stopServer(done);
});
it('should be loaded', () =>
new Promise((resolve, reject) => {
const flow = [{ id: 'n1', type: nodeType, name: 'test name' }];
helper.load(n, flow, () => {
const n1 = helper.getNode('n1');
try {
expect(n1).toBeTruthy();
expect(n1).toHaveProperty('name', 'test name');
resolve();
} catch (e) {
reject(e);
}
});
}));
});
产生的错误是
console.error node_modules/jest-jasmine2/build/jasmine/Env.js:289
Unhandled error
console.error node_modules/jest-jasmine2/build/jasmine/Env.js:290
TypeError: setTimeout(...).unref is not a function
at Immediate.<anonymous> (/dev/custom_nodes/node-red-contrib-x/node_modules/stoppable/lib/stoppable.js:43:39)
at processImmediate (internal/timers.js:439:21)
at process.topLevelDomainCallback (domain.js:126:23)
解决方案最终很简单:将 Jest 配置中的 testEnvironment
设置为 node
,这样 setTimeout 就不会被 Jest 替换为没有 unref 功能的 Jest。
例如在 jest.config.js
module.exports = {
testEnvironment: 'node',
};
我注意到一般情况下,在 Node-RED 中测试自定义节点并不是使用 Jest 完成的 - 我不认为有什么特别的原因,但这是我最熟悉的,所以我正在尝试无论如何。
我的测试设置看起来像
const n = require('../src/index.js');
describe('custom node', () => {
const nodeType = 'custom node';
beforeAll(done => {
helper.startServer(done);
});
afterEach(() => {
helper.unload();
});
afterAll(done => {
helper.stopServer(done);
});
it('should be loaded', () =>
new Promise((resolve, reject) => {
const flow = [{ id: 'n1', type: nodeType, name: 'test name' }];
helper.load(n, flow, () => {
const n1 = helper.getNode('n1');
try {
expect(n1).toBeTruthy();
expect(n1).toHaveProperty('name', 'test name');
resolve();
} catch (e) {
reject(e);
}
});
}));
});
产生的错误是
console.error node_modules/jest-jasmine2/build/jasmine/Env.js:289
Unhandled error
console.error node_modules/jest-jasmine2/build/jasmine/Env.js:290
TypeError: setTimeout(...).unref is not a function
at Immediate.<anonymous> (/dev/custom_nodes/node-red-contrib-x/node_modules/stoppable/lib/stoppable.js:43:39)
at processImmediate (internal/timers.js:439:21)
at process.topLevelDomainCallback (domain.js:126:23)
解决方案最终很简单:将 Jest 配置中的 testEnvironment
设置为 node
,这样 setTimeout 就不会被 Jest 替换为没有 unref 功能的 Jest。
例如在 jest.config.js
module.exports = {
testEnvironment: 'node',
};