如何处理服务器测试中的setInterval
How to deal with setInterval in server tests
假设我们在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
这样的错误。这是因为服务器在异步代码运行之前被关闭,并且internal .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%代码覆盖率的问题,因为有时条件会运行,有时则不会。有什么更好的办法呢?
在测试环境中运行代码时,在设置和配置上有细微的差异是绝对正常的。
一个简单的方法是让应用程序知道当前环境,这样它就可以获得适当的配置并正确设置服务。常见的环境有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
相关文章:
- 模糊事件的Javascript测试
- 我的单元测试选项是什么
- 测试索引值是否等于某个数字的倍数
- node.js:setInterval()正在跳过调用
- 在localhost Dev Box上测试JSONP请求的最佳方式
- 测试数组中每个项的内容
- 测试Angular Service解决错误回调中的promise
- 使用Jest测试React Native应用程序
- 为函数代码编写测试
- 如何在Angular单元测试中从另一个控制器的rootScope将方法添加到rootScope中
- 如何使用JS/nightwatchjs并行运行多个测试
- 使用量角器的当前url单元测试的getTitle
- 茉莉花宝石-耙茉莉花:ci dons't运行测试
- JavaScript滚动脚本-在测试中激发,而不是在开发站点上
- AngularJS指令单元测试中未定义的函数
- 一个密码测试程序,如果存在空格,它会提醒用户
- 测试角度解析方法
- Protractor:在Iframe中测试非角度应用程序
- 如何处理服务器测试中的setInterval
- 正在测试使用setInterval或setTimeout的Angular2组件