2015-12-04 2 views
0

Я пишу набор тестов для сервера. В основном есть предварительно определенные запросы и ожидаемые ответы для каждого из них.Тесты для асинхронных функций, которые зависят от предыдущего с mochajs

Тесты хранятся в json-файле, поэтому я мог бы впоследствии расширить его по мере необходимости.

Несколько тестов полагаются на два идентификатора предшествующего теста, поэтому тесты не должны выполняться параллельно. Для архивирования я использую waterfall function of the async library, поэтому я могу передать аргументы следующей функции.

Проблема заключается в том, что, когда я повторяю этот массив тестов, я вызываю it(testname, function(done){...}). В этой функции я выполняю запрос и сравниваю ответ с ожидаемым ответом. После этого я вызываю функцию done, поэтому мочайы знают, что тест закончен.

Когда я начинаю тесты, первый из них выполняется, но не более.

Для меня это похоже, что mochajs распознает, что в настоящее время нет другой тестовой задачи, поэтому она останавливает сценарий.

Это испытание:

var testFunctions=[]; 

predefinedTests.forEach(function(test){ 
    var fn = function(error, id_1, id_2, callback){ 

     it("Test", function(done){ 
      makeAsyncRequest(test.url, function(res){ 
       expect(res).to.have.properties(test.answer); 
       id_1=res.id1; 
       id_2=res.id2; 
       done(); 
       /*check if it's the first test, 
       if that's the case it needs to use the first argument as callback */ 
       if(callback==undefined) return error(null, id_1, id_2); 
       callback(null, id_1, id_2); 
      }); 
     }); 

    } 
    testFunctions.push(fn); 
}); 
async.waterfall(testFunctions); 

ответ

1

поэтому тесты не должны выполняться параллельно.

Объявление об асинхронном тесте говорит только Mocha, что должно дождаться завершения теста, а не того, что он может свободно запускать тесты параллельно. Mocha не запускает тесты параллельно, независимо от того, являются ли они синхронными или нет. Таким образом, вам не нужно использовать async, чтобы предотвратить выполнение Mocha чего-то, чего он не делает в первую очередь. (Там существуют пакеты, которые вы должны добавить к вашей тестовой установке, если вы хотите, тестов, работающие параллельно. Как this one. Предположительно, они залатать Мокко добавить параллельный потенциал.)

Вы должны просто удалить async материал, и получите ваш foreEach callback call it напрямую.

Кроме этого, вы установили свой тестовый пакет, чтобы один тест зависел от состояния предыдущего теста. Как правило, вы должны написать свои тесты Mocha, чтобы они были независимы друг от друга. Mocha действительно спроектирован так, что тесты должны запускаться независимо. Например, если вы используете --grep для выбора только подмножества тестов. Mocha не будет знать о зависимостях между вашими тестами, и вы получите сбои, если выбранные тесты зависят от тестов, которые не были выбраны. Как правило, вы хотите поставить что-нибудь, что зависит от теста в крюке before или beforeEach.

Если вы находитесь в ситуации, когда выполнение этого было бы обременительным, вы могли бы сохранить состояние в более широком диапазоне. Я бы не хотел, чтобы сделать его глобальным, так что я бы поставил все внутри describe:

describe("all tests", function() { 
    // WARNING: The following tests must be run in sequence. 
    // We have to do this because [explain here what reason requires 
    // this setup]. 
    var id1; 
    var id2; 

    predefinedTests.forEach(function(test){ 
     it("Test", function(done){ 
      makeAsyncRequest(test.url, function(res){ 
       expect(res).to.have.properties(test.answer); 
       id1=res.id1; 
       id2=res.id2; 
      done(); 
     }); 
    }); 
}); 

(я не вижу в вашем вопросе, как idX переменные используются, чтобы сделать новый запрос, чтобы мой код выше не показывает. Предполагаю, что makeAsyncRequest каким-то образом их воспользуется.)

+0

Это означает, что я могу объявить две глобальные переменные для своих идентификаторов и просто использовать их на каждой итерации? – jonadev95

+0

Я вижу, что код получает идентификаторы из 'test.id1' и' test.id2' (то есть 'id_1 = test.id1' и' id_2 = test.id2'). Я также вижу, что у вас есть 'id_1' и' id_2' в списке параметров функций, вызываемых 'async.waterfall', и значения передаются следующей функции, но я не вижу в этом никакого эффекта вообще , (Значение, если на самом деле Mocha смог выполнить все ваши тесты, результат, который вы получите, не соответствует ожидаемому.) – Louis

+0

Разве что 'test.id1' и' test.id2' * назначены * 'makeAsyncRequest' ? (Если это так, я не получил это из вашего вопроса.) – Louis

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