2013-11-02 1 views
14

작은 AngularJS 앱으로 각도기를 테스트하고 있습니다.

테스트입니다 :

describe('Testing Protractor', function() { 
    var draftList; 

    it('should count the number of drafts', function() { 
    browser.get('#/'); 
    draftList = element.all(by.repeater('newsletter in drafts')); 
    expect(draftList.count()).toEqual(2); 
    }); 
}); 

컨트롤러 :

angular.module('myApp.controllers', []). 
    controller('DraftsCtrl', ['$scope', 'Draft', function($scope, Draft) { 
    $scope.drafts = Draft.query(); 
}]) 

초안 서비스 :

:

angular.module('myApp.services', ['ngResource']). 
    factory('Draft', ['$resource', 
    function($resource) { 
     return $resource('api/drafts/:id') 
    }]) 

다음과 같은 오류에 각도기 결과를 사용하여이 테스트를 실행 53,210

그러나, 컨트롤러에서 나는이 라인을 변경하면이에

$scope.drafts = Draft.query(); 

을 :

$scope.drafts = []; 

더 중요한 것은 예상하지만, 같은 시험은 실패가 시간 초과되지 않습니다.

브라우저에서 앱을 수동으로 실행할 때와 각도기로 열린 브라우저 창을 볼 때 API에서 반환 한 데이터가 리피터에 의해 올바르게 표시됩니다.

서비스가 API와 통신 할 때 각도기가 페이지와 동기화 할 수없는 이유는 무엇입니까?

AngularJS는 v1.2.0-rc3입니다. 각도기는 v0.12.0입니다.

답변

26

이것은 known issue이지만 일시적인 해결 방법이 있습니다. ptor.ignoreSynchronization = true을 설정하십시오. 예를 들어

는 :

describe('Testing Protractor', function() { 
    var draftList; 
    var ptor; 

    beforeEach(function() { 
    ptor = protractor.getInstance(); 
    ptor.ignoreSynchronization = true; 
    }); 

    it('should count the number of drafts', function() { 
    ptor.get('#/'); 
    draftList = element.all(by.repeater('newsletter in drafts')); 
    expect(draftList.count()).toEqual(2); 
    }); 
}); 
+1

감사합니다, 나중에 이것을 시도하고 당신이 그것을 작동 여부를 알려 드리겠습니다. 여기에 글을 올리기 전에 실제로 GitHub 문제를 읽었지만, 테스트 애플 리케이션이하지 않는 API를 정기적으로 폴링 할 때 해결 방법 만 필요하다는 인상하에있었습니다. 컨트롤러가 초기화되면 API 요청을 한 번만 보냅니다. –

+10

이것은 실제로 올바른 해결책이었습니다. Protractor 0.12.0이 Protractor의 인스턴스를'browser'로 드러내 기 때문에,'element.all (by.repeater ('...')); '앞에'browser.ignoreSynchronization = true;'를 추가하면됩니다. –

+0

완벽하게 작동합니다! – softvar

3

browser.ignoreSynchronization = true; 은 날 위해 일했습니다.

1

저는 각도기 3.3.0을 사용하고 있습니다.이 기능을 내 테스트에서 작동 시키려면 설정을 완료 할 때까지 무시 동기화를 연기해야했습니다. 사람이 더 나은 방법이있다, 그래서 만약 내가이 sleep 통화에 대한 행복하지 않다 (

var searchBox = element(by.css('#inpt_search')); 
searchBox.sendKeys('test'); 

내가 다음보기를 채우기 위해 모의 백엔드 기다릴 필요가 :

그래서 내 beforeEach에 내 액션을 호출 이 말을하시는 분은 browser.sleep(500)을 사용하여 expectedConditions.presenceOf을 같은 버그의 일부로 사용할 수 없습니다. 그런 다음 테스트에서 나는 차단 된 내용을 차단 해제하고 브라우저 내용을 보는 browser.ignoreSynchronization = true을 설정합니다.

describe('standard search', function(){ 
    beforeEach(function(){ 
     openApp(); 
     var searchBox = element(by.css('#inpt_search')); 
     searchBox.sendKeys('test'); 
     browser.sleep(500); 
    }); 
    it('should work or summat', function() { 
     browser.ignoreSynchronization = true; 
     var fileItems = element.all(by.repeater('item in list')); 
     expect(fileItems.count()).toEqual(50); 
    }); 
}); 
+0

Stevo에 감사드립니다. 각도기 4.0.10에서 작동합니다. –

0

browser.ignoreSynchronization 대신에 browser.waitForAngularEnabled(*boolean*)을 사용하십시오. browser.waitForAngularEnabled(false) 세트는 browser.ignoreSynchronization에서 true, browser.waitForAngularEnabled(true)browser.ignoreSynchronization에서 false으로 설정합니다.

당신은 또한 당신의 테스트 스위트 '설정 파일의 한 부분으로이 포함될 수 있습니다

onPrepare: function() { 
    'use strict'; 
    browser.waitForAngularEnabled(false); 
} 
관련 문제