2

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

4

1 回答 1

0

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

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

简单示例,使用环境变量:

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

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

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

ENV=testing npm test
于 2016-11-14T18:06:35.790 回答