假设我们在 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% 代码覆盖率的问题,因为有时该条件会运行,有时则不会。有什么更好的方法来解决这个问题?