Зацикливание на испытании транспортира с параметрами

У меня есть набор дымовых экранов, которые все очень похожи. Я хотел бы поместить их в цикл и цикл в массив параметров. Тем не менее, тесты выполняются асинхронно, поэтому цикл завершается до запуска тестов. Это приводит к тому, что тест выполняется 8 раз по 8-му параметру вместо одного для каждого параметра.

describe('Admin Console Campaigns', function() {
    var ptor;
    var adminUrl;
    var testParams = [
        {title: 'Dashboard', urlSuffix: '/communic8' },
        {title: 'Campaign Report', urlSuffix: '/Reports/Campaign' },
        {title: 'Partner Campaign Usage', urlSuffix: '/Reporting/PartnerCampaignUsage' },
        {title: 'Campaign Template Usage', urlSuffix: '/Reporting/CampaignTemplateUsage' },
        {title: 'Email Usage Report', urlSuffix: '/Reports/EmailUsage' },
        {title: 'Campaign Templates', urlSuffix: '/CampaignTemplates' },
        {title: 'Campaign Template Groups', urlSuffix: '/CampaignTemplateGroups' },
        {title: 'New Template', urlSuffix: '/CampaignTemplates/Add' }
    ];

    beforeEach(function() {
        ptor = protractor.getInstance();
        ptor.ignoreSynchronization = true;
        var testParams = smokescreenTestConfig.adminCampaigns;
        adminUrl = ptor.params.http + ptor.params.client + ptor.params.staging + ptor.params.sharedvue + ptor.params.admin;
    });

    afterEach(function(){

    });

    for(var i=0; i < testParams.length; i++){
        var testParam = testParams[i];

        it('should have a ' + testParam.title + ' tab', function() {
            testUrl = adminUrl + testParam.urlSuffix;
            basicTestFunctions.pageExists(testUrl, ptor, browser, testParam.title);
        }, 60000);
    };
});

Кто-нибудь имеет представление о том, как заставить цикл ждать тестов?

Ответ 1

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

var testParams = testConfig.testArray;

for (var i = 0; i < testParams.length; i++) {

  (function (testSpec) {
    it('write your test here', function () {
      //test code here
    });
  })(testParams[i]);

};

Ключевым моментом здесь является то, что "testParams [i]" в конце функции, проходящей в итерации цикла. Это приводит к синхронному выполнению.

Если вы хотите стать действительно сумасшедшим, мы также закончили писать пакетный файл, который работает с этой дымовой завесой примерно 50 раз подряд для всех наших клиентов. Мы дышим экранируем всю нашу платформу примерно через 10 минут.

Ответ 2

Вы также можете создать массив со спецификациями:

var testParams = testConfig.testArray;

testParams.forEach(function(testSpec) {
    it('write your test here', function() {
        //test code here
    });
});

Это должно работать как решение, предложенное Робертом МакКроу.

Ответ 3

С некоторым асинхронным кодом вы можете решить это довольно легко.

вместо it('description', function () { // my test }); используйте it('description', function (done) { // my test with a call to done() at the end }

Вы можете использовать этот фрагмент в качестве примера:

for (var i = 0; i < 10; i++) {
  it('should work for ' + i, function (done) {
    setTimeout(done, 1000);
  });
}  

Ожидаемый результат:

✓ should work for 0 (1000ms)
✓ should work for 1 (1001ms)
✓ should work for 2 (1001ms)
✓ should work for 3 (1001ms)
✓ should work for 4 (1001ms)
✓ should work for 5 (1001ms)
✓ should work for 6 (1002ms)
✓ should work for 7 (1001ms)
✓ should work for 8 (1001ms)
✓ should work for 9 (1002ms)

Надеюсь, что это поможет.