Допустим, мы используем setInterval внутри хапи плагина, например, так:Как бороться с 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% -ного охвата кода, потому что иногда это условие будет запущено, а иногда и не будет. Что было бы лучше?
Попытка достичь покрытия кода 100% так 90-х. – DanFromGermany
@DanFromGermany. Разница между прицелом на 100% и наличием одного теста варьируется в размере покрытия, которое он обеспечивает каждый раз, когда он работает из-за внешних факторов. –
@ Джеймс Торп: Точно. Мы могли бы явно прокомментировать условное условие, чтобы контролер покрытия игнорировал его, но я ищу чистый способ сделать это, а не только что-нибудь, что работает. –