2016-11-14 7 views
2

Допустим, мы используем 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% -ного охвата кода, потому что иногда это условие будет запущено, а иногда и не будет. Что было бы лучше?

+0

Попытка достичь покрытия кода 100% так 90-х. – DanFromGermany

+0

@DanFromGermany. Разница между прицелом на 100% и наличием одного теста варьируется в размере покрытия, которое он обеспечивает каждый раз, когда он работает из-за внешних факторов. –

+0

@ Джеймс Торп: Точно. Мы могли бы явно прокомментировать условное условие, чтобы контролер покрытия игнорировал его, но я ищу чистый способ сделать это, а не только что-нибудь, что работает. –

ответ

0

Совершенно нормально иметь небольшие отличия в настройке и настройке при запуске кода в тестовой среде.

Простой подход заключается в том, чтобы приложение могло узнать текущую среду, чтобы оно могло получить соответствующую конфигурацию и правильно настроить службу. Общие условия: 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 
+0

Я ценю ответ, но я не чувствую, что использование переменных среды действительно отвечает на вопрос. В этом примере плагин должен работать одинаково независимо от того, в какой среде он находится, и он работает так, как он предназначен. Я чувствую, что добавление переменных среды в условное будет просто добавить слой сложности к первому примеру, которое я дал. –

+0

Я не уверен, что согласен: у вас есть код, который вы не хотите запускать в тестовой среде, и этот подход делает именно это. С другой стороны, предлагаемое выше решение заставит вас игнорировать законные ошибки, потому что вы спрашиваете, инициализированы ли определенные переменные или нет, что может произойти по ошибке (включая ошибки времени, которые трудно отследить). Реальный вопрос: _am я тестирую? _, А не _is это неопределенное? _ – slezica