2015-06-11 2 views
2

Мне интересно, как выполнить несколько блоков «описать» в синхронном порядке?Транспортир в узле: Как мне заставить мои тесты работать синхронно?

describe('Go To Home Page', function() { 
    browser.ignoreSynchronization = true; 
    it("Url should be on Login Page", function() { 
     browser.get(HomePageUrl).then(function() { 
      browser.wait(urlChanged(loginPageUrl), 2000).then(
       function (newurl){ 
        var url = browser.getCurrentUrl().then(function (url) { 
         expect(url).tobe(loginPageUrl); 
         //I know I'm at Login page url... how do I kick off next test?     
        });      
       } 
      )   
     }); 
    }); 
}); 

Этот тест идет на домашней странице, а затем, если он будет перенаправлен на страницу входа в систему, я хочу, чтобы выполнить все мои тесты Вход с использованием новых описывают блоки. Проблема в том, что если я поставлю следующий блок Describe на том же уровне, что и первый, узел выполнит все из них параллельно.

Я бы предпочел не попасть в callback-hell ... код выше уже слишком глубок, на мой взгляд.

+1

Они работают синхронно. Вы отключите угловую синхронизацию в начале, которая ведет себя так: [control-flow] (https://github.com/angular/protractor/blob/master/docs/control-flow.md). –

+1

Кроме того, помещая блок 'describe' в' '' '', вы делаете ваши тесты опирающимися друг на друга, что всегда является рецептом для катастрофы. Проверьте свою страницу входа в тест, а затем сделайте 'beforeEach' для ваших других тестов, которые регистрируют вас или какие-либо настройки, которые вам нужны для них. –

+1

В противном случае может возникнуть вопрос о возврате '' перед 'browser.wait'. –

ответ

5

Jasmine имеет Asyncronous support exacly для этого.

describe('Go To Home Page', function() { 
    browser.ignoreSynchronization = true; 
    it("Url should be on Login Page", function (done) { 
     browser.get(HomePageUrl).then(function() { 
      browser.wait(urlChanged(loginPageUrl), 2000).then(
       function (newurl){ 
        var url = browser.getCurrentUrl().then(function (url) { 
         expect(url).tobe(loginPageUrl); 
         done();  
        });      
       } 
      )   
     }); 
    }); 

    it("next", function() { 
     //will start this block after previous done callback has been called 
    }); 
}); 

PS Обещания могут и должны быть соединены в одну линию, чтобы избежать вложенности:

it("Url should be on Login Page", function (done) { 
    browser 
     .get(HomePageUrl) 
     .then(function() { 
      return browser.wait(urlChanged(loginPageUrl), 2000); 
     }) 
     .then(function() { 
      return browser.getCurrentUrl(); 
     }) 
     .then(function (currentUrl){ 
      expect(currentUrl).tobe(loginPageUrl); 
      done();   
     }); 
}); 
Смежные вопросы