2015-06-22 142 views
3

我想測試一個簡單的端到端流量 - 使用量角器創建一個新的帳戶。量角器E2E測試 - 異步Rest API調用

我有一個AngularJS應用程序包含一個創建賬戶頁面,用戶需要填寫一個簡單的表單並點擊提交。

點擊提交會觸發一個方法,該方法調用異步方法在我的服務器中創建帳戶。

當該函數返回時,用戶被定向到不同的頁面。

這裏是我的測試(creatAccount.spec.js):

describe('Create Account Page Tests', function() { 

    it('createAccount success', function(){ 
     browser.get('http://localhost:9001/#/createAccount'); 
     element(by.model('user.organizationName')).sendKeys('Westeros'); 
     element(by.model('user.firstName')).sendKeys('John'); 
     element(by.model('user.lastName')).sendKeys('Snow'); 
     element(by.model('user.email')).sendKeys('[email protected]'); 
     element(by.model('user.password')).sendKeys('123'); 
     element(by.model('confirmPassword')).sendKeys('123'); 

     element(by.id('submitBtn')).click(); 

     expect(browser.getCurrentUrl()).toEqual('http://localhost:9001/#/userManagement'); 

    }); 

}); 

這裏是我的提交方式:

$scope.submit = function() { 
     $scope.submitted = true; 
     UserService.createAccount($scope.user) 
      .then(function success(){ 
       $state.go('userManagement'); 
      }, function failure(){ 
       $log.error("something went wrong"); 
     }); 
    }; 

這裏是我的UserService.createAccount方法:

function createAccount(user){ 
      var deferred = $q.defer(); 
      APIService.sendRequest(APIService.ACTION().createAccount, undefined, user) 
       .then(function success(res) { 
        deferred.resolve(); 
       }, function failure(reason){ 
        $log.debug('create account failed. reason: ', reason); 
        deferred.reject(reason); 
       }); 

      return deferred.promise; 
     } 

這裏是我的APIService.sendRequest方法:

function sendRequest(action, params, data){ 
      var defferd = $q.defer(); 
      var request = $resource(action.url, {}, {send: {method: action.method, isArray: action.isArray ? action.isArray : false, withCredentials: true}}); 

      if (!params){ 
       params = {}; 
      } 

      request.send(params, data, function(res) { 
       defferd.resolve(res); 
      }, function(error) { 
       defferd.reject(getErrorReponseListError(error)); 
      }); 

      return defferd.promise; 
     } 

我的測試一直失敗,因爲頁面沒有定向到下一頁。在我看來,像測試不等待異步方法,甚至認爲它應該返回......

我試着打電話browser.waitForAngular()browser.wait(5000)但沒有什麼幫助......

+0

您應該使用'$ http'來使量角器能夠在執行getCurrentUrl之前等待正確的角度。否則,請嘗試使瀏覽器等待url改爲改爲:http://stackoverflow.com/questions/30891693/protractor-done-and-expect-why-do-we-need-wait/30893472#30893472 –

回答

2

這條線:

expect(browser.getCurrentUrl()).toEqual('http://localhost:9001/#/userManagement'); 

預計瀏覽器URL爲馬上。它不會等待URL更改。該行之前的click完成,但這意味着單擊已傳送到瀏覽器,而不是瀏覽器中的處理程序已完成(以及它的異步)。

您需要教您量角器測試以等待瀏覽器達到預期狀態。像這樣的東西應該工作:

browser.wait(function() { 
    return browser.getCurrentUrl().then(function(url) { 
     return url === 'http://localhost:9001/#/userManagement'; 
    }); 
}); 

所以,相反的期待的網址是你說的話,這等待的網址是你想要的。在與瀏覽器進行大多數交互之後(例如,提交任何內容或與服務器進行任何其他交互),您需要等待頁面進入新狀態。

+0

FYI ,這裏是一個類似的問題和自定義的期望條件與從外部傳遞的網址:http://stackoverflow.com/a/30491962/771848。 – alecxe

+0

謝謝! 現在瀏覽器實際上等待,但現在我有一個跨域問題有什麼有用的嗎? –

+0

通過添加我的conf的功能解決了它。js功能:{'browser_Name':'chrome', 'chromeOptions':{ 'args':['--disable-web-security'] } }, –

相關問題