假设我们在hapi插件中使用setInterval,如下所示:
// index.js
internals = {
storage: {},
problemFunc: () => {
setInterval((storage) => {
storage.forEach((problem) => {
problem.foo = 'bar';
});
}, 500);
}
};
module.exports.register = (server, options, next) => {
server.on('start', () => { // called when the server starts
internals.storage.problem1 = {};
internals.storage.problem2 = {};
internals.storage.problem3 = {};
internals.problemFunc(internals.storage);
});
}
在我们对此服务器的测试中,我们可能会多次启动和停止服务器以测试服务器的不同方面。有时,我们会收到cannot set property 'foo' of undefined
之类的错误。这是因为服务器在异步代码运行之前立即关闭,而internals.storage.problem会随着服务器停止而被删除。
这完全有道理,而且我没有遇到任何问题。我真的很想知道什么是一些好的方法来确保我的测试在100%的时间内工作而不是90%的时间。
我们可以做到:
problemFunc: () => {
setInterval((storage) => {
storage.forEach((problem) => {
if (problem !== undefined) { // check if deleted
problem.foo = 'bar';
}
});
}, 500);
}
或:
problemFunc: () => {
setInterval((storage = {}) => { // default assignment
storage.forEach((problem) => {
problem.foo = 'bar';
});
}, 500);
}
但我宁愿不在我的代码中添加条件,以便我的测试通过。此外,这可能导致保持100%代码覆盖率的问题,因为有时候条件会运行,有时它不会。什么是更好的方法来解决这个问题?
答案 0 :(得分:0)
在测试环境中运行代码时,在设置和配置方面略有不同是绝对正常的。
一种简单的方法是让应用程序知道当前环境,以便它可以获得适当的配置并正确设置服务。常见环境为testing
,development
,staging
和production
。
简单的例子,使用环境变量:
// env.js
module.exports.getName = function() {
return process.env['ENV'] || 'development'
}
// main.js
if (env.getName() !== 'testing') {
scheduleBackgroundTasks()
}
然后通过ENV
变量运行测试,或告诉测试运行者执行此操作:
ENV=testing npm test