Я начинаю с тестов в Node. Использование mocha, chai и nock (для перехвата внешних вызовов HTTP API).
Я написал 3 теста, все они пройдены, однако, когда я добавил третий тест, мокко перестало выходить после запуска тестов, без ошибок или указаний на что-то не так.
Если я прокомментирую 3-й тест, мокко выходит нормально.
Это тест, вызывающий «проблему»:
describe('tokenizer.processFile(req, \'tokenize\')', () => {
it('should tokenize a file', async () => {
req = {
file: {
originalname: 'randomcards.txt',
buffer: cardsFile_buffer
},
user: {
displayName: user
}
};
expect(Buffer.from(await tokenizer.processFile(req, 'tokenize'))).to.deep.equal(tokensFile_buffer);
});
});
Опять же, этот тест - успешный, что сбивает меня с толку.
Вот код tokenizer.processFile:
processFile: function(req, whatTo){
combinedLogger.info(`Request to ${whatTo} ${req.file.originalname} received. Made by: ${req.user.displayName}`);
return new Promise(function(resolve, reject){
const lines = [], responses = [];
const lineReader = require('readline').createInterface({
input: require('streamifier').createReadStream(req.file.buffer)
});
lineReader.on('line', line => {
lines.push(line);
});
lineReader.on('close', async () => {
//process every line sequentially
try {
//ensure DB connected to mass insert
await db_instance.get_pool();
for(const line of lines) {
var response;
req.current_value = line;
if (whatTo == 'tokenize'){
response = await Tokenize(line);
db_instance.insertAction(req, 'tokenize', response);
}
else if (whatTo == 'detokenize'){
combinedLogger.info(`Request to detokenize ${line} received. Made by: ${req.user.displayName}`);
response = await Detokenize(line);
db_instance.insertAction(req, 'detokenize', line);
}
responses.push(response);
}
resolve(responses.join("\r\n"));
}
catch(error){
reject(error);
}
});
});
}
Функции Tokenize (значение) и Detokenize (значение) также вызываются в двух других тестах, при запуске которых мокко завершается нормально.
Есть идеи, что вызывает это?
Версия мокко: 5.1.1





Я знаю, что на это немного поздно отвечать, но я столкнулся с аналогичной проблемой и увидел ваш пост.
В mocha 4.0.0 изменили поведение тестов при доработке. Из здесь:
If the mocha process is still alive after your tests seem "done", then your tests have scheduled something to happen (asynchronously) and haven't cleaned up after themselves properly. Did you leave a socket open?
В вашем случае кажется, что звонок на createReadStream() никогда не закрывался.
Итак, у вас есть 2 варианта:
Вариант А: Закройте fs и другие открытые потоки (рекомендуется)
Вариант Б: Запускаем мокко с опцией --exit.
... как дождаться завершения всех тестов? Моя проблема в том, что я запускаю соединение mongodb в своей функции --delay ... Нет события onTestsDone ...
@RayFoss, я думаю, в этом случае вам нужно использовать метод done (), чтобы указать, что ваш тестовый пример завершен ... Проверьте: medium.com/caffeine-and-testing/…
Такое поведение может быть действительно полезным, и я бы не рекомендовал принудительно завершать тесты. Обычно, когда мокко зависает и не выходит, в вашем коде есть что-то, что нужно очистить. Лучше найти проблему. Таким образом я обнаружил много потенциальных утечек.
Так что, если тест просто зависает, а я не использую createReadStream?
Это спасло мне жизнь!
Я использовал npmjs.com/package/why-is-node-running, чтобы выяснить, почему мое приложение узла все еще работает.
Добавление флага --exit в тестовый скрипт в package.json помогло мне
Не пытайтесь закрыть или побеждать такое поведение. В моем случае драйвер MongoDB был оставлен открытым, и в результате тест продолжался, как упоминалось в @ reads0520.
я собирался сказать это, опция --exit в вашем тесте и все!