2016-03-23 4 views
0

У меня есть модуль загрузки, который последовательно загружает массив файлов. Загрузка должна запускаться только после завершения предыдущей загрузки.Как сгенерировать единицу теста сгенерированной цепочки обещаний

Обещание цепь построена для достижения этой цели:

let chain = Promise.resolve(); 

files.forEach(file => { 
    chain = chain.then(() => upload(file)); // upload returns a promise 
}); 

chain.then(() => console.log('Files uploaded')); 

Я хочу, чтобы убедиться, что эта цепь выполняет upload() спина к спине. Как я могу проверить его?

+0

По определению и правильной реализации обещаний он будет вызывать первый 'upload()' и не вызывать его еще до первого разрешения. Вот как работают обещания. Таким образом, если вы не пытаетесь проверить обещания, кажется, что вы действительно знаете, что «upload()» не разрешает, пока загрузка не будет завершена. Вы не можете сделать это из черного ящика снаружи. Вам нужно либо иметь некоторые данные с сервера, чтобы проверить, что из одного источника поступает только одна загрузка, либо вам придется написать некоторые тесты самой функции загрузки, чтобы протестировать различные условия и т. Д. – jfriend00

+0

@ jfriend00 Я думаю, что преимущество тестирования этой цепочки заключается в отсутствии обещания. Выполнение выше на самом деле довольно хрупкое. Если вы не завернули функцию 'upload()' в другой функции или не забыли вернуть обещание, все закачки будут выполняться параллельно. Поэтому я считаю, что он все еще стоит усилий для тестирования генерации цепочки. Я думаю, попробую заглушить функцию 'upload()', чтобы убедиться, что она завершена до вызова другого. Благодаря! – PSWai

+0

Дело в том, что проблема полностью связана с реализацией 'upload()'. Не стесняйтесь тестировать все остальное, если хотите, но это реализация 'upload()', которая определяет, работает ли это или нет, и вы должны будете иметь возможность точно видеть, что он делает (на сервере), чтобы проверить, что вы спросили. – jfriend00

ответ

0

верните цепь из своего теста, мокко будет ждать обещаний решить. Вы можете захотеть подключить какой-то шпион, чтобы подсчитать количество вызовов, которые можно ожидать в then() вашей полной цепи после этого. Вам также нужно вернуть загрузку в ваш обработчик, чтобы сеть ожидала, что обещание будет разрешено, прежде чем вызывать следующий шаг.

it('test chain', function() { 
    let chain = Promise.resolve(); 

    files.forEach(file => { 
    chain = chain.then(() => return upload(file)); // upload returns a promise 
    }); 

    return chain.then(() => console.log('Files uploaded')); 
} 
+0

Хм .... но как я знаю, что они выполняются один за другим? Поскольку параллельное выполнение также приводит к тому же счету вызова. Кстати, функция стрелки без фигурных скобок автоматически возвращает свое тело. :) – PSWai

+0

Ах, да, извините, мой плохой о функции стрелки, не выглядел достаточно близко. Вы можете добавить ожидание для каждого приращения, где вы ожидаете инкрементного значения, но, возможно, это будет за пределами вашего тестового кода? Неясно, был ли ваш фрагмент кода тестом или фактической реализацией. – jishi

+0

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

Смежные вопросы