如何在服务器测试中处理setInterval

时间:2016-11-14 16:39:14

标签: javascript testing asynchronous setinterval hapi.js

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

1 个答案:

答案 0 :(得分:0)

在测试环境中运行代码时,在设置和配置方面略有不同是绝对正常的。

一种简单的方法是让应用程序知道当前环境,以便它可以获得适当的配置并正确设置服务。常见环境为testingdevelopmentstagingproduction

简单的例子,使用环境变量:

// env.js
module.exports.getName = function() {
  return process.env['ENV'] || 'development'
}

// main.js
if (env.getName() !== 'testing') {
  scheduleBackgroundTasks()
}

然后通过ENV变量运行测试,或告诉测试运行者执行此操作:

ENV=testing npm test