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

How to deal with setInterval in server tests

本文关键字:测试 setInterval 服务器 何处理 处理      更新时间:2023-09-26

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

在测试环境中运行代码时,在设置和配置上有细微的差异是绝对正常的。

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

一个简单的例子,使用环境变量:
// env.js
module.exports.getName = function() {
  return process.env['ENV'] || 'development'
}
// main.js
if (env.getName() !== 'testing') {
  scheduleBackgroundTasks()
}

然后通过ENV变量运行测试,或者告诉测试运行器这样做:

ENV=testing npm test