2016-03-01 52 views
1

我試圖爲我們的角度應用程序設置端到端測試,但我遇到了幾個障礙。量角器延期推輓

一個是引導。我們正在使用這個庫:angular-deferred-bootstrap來引導我們的應用程序。這個庫允許我們使http調用的結果被注入我們的應用程序(如角value())。然後它調用bootstrap函數來實際引導應用程序的角度。我希望測試在完成這個增強記錄後運行。

這是我迄今

describe('navigation should', function() { 
    beforeEach(function() { 
     // load homepage 
     browser.get('/'); 
    }, 10000); 

    it('show side navigation', function() { 
     browser.wait(function() { 
      var deferred = protractor.promise.defer(); 

      element(by.css('body.deferred-bootstrap-loading')).isPresent() 
       .then(function (isPresent) { 
        deferred.fulfill(!isPresent); 
       }); 

      return deferred.promise; 
     }); 
    }); 
}); 

完成的圖書館方便地把對body一個deferred-bootstrap-loading類。我正在等待,直到它被刪除。

問題是有時我得到錯誤Error while waiting for Protractor to sync with the page: "[ng:test] no injector found for element argument to getTestability\nhttp://errors.angularjs.org/1.4.8/ng/test"

它似乎比它(測試)傳遞更頻繁地產生這個錯誤。

我不明白這是什麼問題?量角器在角度有機會運行之前運行嗎?

如果browser.wait返回承諾,我是否必須在回調中運行所有測試?

此外,我想這個代碼運行每個測試(等待引導完成)。組織這個的最好方法是什麼?

回答

2

我會嘗試做的是關閉同步,直到預期的條件滿足

beforeEach(function() { 
    var EC = protractor.ExpectedConditions; 

    browser.ignoreSynchronization = true; 
    browser.get('/'); 

    // wait for deferred bootstrap body to not be present 
    var body = $("body.deferred-bootstrap-loading"); 
    browser.wait(EC.stalenessOf(body), 10000).then(function() { 
     browser.ignoreSynchronization = false; 
    }); 
    browser.waitForAngular(); // might not be needed 
}); 

此外,我想這段代碼爲每個測試運行(等待引導完成)。組織這個的最好方法是什麼?

請參閱:

+1

你應該擁抱一個擁抱 – Umair

0

當你使用手動/半手動引導機制,我不會用browser.get()因爲這等待角是裝。之後,請使用browser.driver.get()並在deferred-bootstrap-loading課上添加一個等待。請參閱Angular的Setting Up the System Under Test

所以像下面應該做的伎倆:

describe('navigation should', function() { 
    beforeEach(function (done) { 
     // load homepage 
     browser.driver.get('/'); 
     browser.driver.wait(function() { 
      return browser.driver.isElementPresent(by.class('body.deferred-bootstrap-loading')) 
       .then(function (el) { 
        return el === false; 
       }); 
     }).then(done); 
    }, 10000); 

    it('show side navigation', function() { 
     // normal test here 
    }); 
}); 

我沒有測試以上,但你應該得到的圖片。 通過製作beforeEach異步並等待該類從body標記中消失,您可以預計在運行it塊時,所有內容都將運行。