2017-12-14 2 views
9

우리는 오히려 거대한 테스트 코드베이스를 가지고 어떤 상황에서 (자바 스크립트 코드의 약 10000 라인), 우리는 각도기 - 투 - 각도 동기화를 해제해야 시간 우리는 동기화를 다시 켜는 것을 잊지 않습니다. 모든 후속 테스트가 실패하고 디버깅하는 데 시간과 노력이 필요한 명확하지 않은 이유가 있습니다.각도기를 각도 동기화로 다시 설정하는 것을 잊지 않으려면 어떻게해야합니까? 문제가 시간에서까지이며,</p> <pre><code>browser.ignoreSynchronization = true; </code></pre> <p>을하지만 :

테스트에서 동기화가 다시 켜지는 방법이 있습니까?

ESLint을 기반으로 정적 코드 분석을 수행하고 코드 검토를 수행합니다.

+1

아마도 래퍼 함수를 ​​작성하십시오. 'beginSync (() => {...})'는 시작과 끝에서 그것을 끈다. 이것은 전체 콜백이나 그 일부만을 감쌀 수있다. 그런 다음 해당 기능에서 속성 만 직접 설정합니다. – jonrsharpe

+0

@jonrsharpe hm, "컨텍스트 관리자"와 같은 멋진 아이디어, 나는 그것을 좋아한다. 때로는 여러개의 it()'s에 대해 그것을 줄 필요가 있지만 때때로. – alecxe

+0

대신 webdriverio를 사용하십시오. 그렇다면 걱정할 필요가 없습니다. 모든 진지하게, 이것은 필자가 각도기에서 wdio로 전환 한 정확한 이유입니다. 프레임 워크가 커지면 동기화가 켜지는 시점을 추적하는 것이 악몽이됩니다. 내 경험에 비추어 볼 때 마이그레이션 할 때 코드가 적어졌습니다. – tehbeardedone

답변

9

난 그냥 afterTest 훅을 (테스트 러너에 따라 다릅니다)처럼 호출 테스트를 다시 시작하거나 어떤 이유로 든 추락 한 테스트는 영향을받지 않습니다.

쟈스민에 대한 코드입니다. 각도기의 설정 :

onPrepare() { 
    ... 
    afterEach(function() { 
    // Setting ignoreSychronization back to true, in case it was changed in tests 
    browser.waitForAngularEnabled(true); 
    // Setting back to default frame. In case test was working in iframe 
    browser.switchTo().defaultContent(); 

    // This depends on your architecture. We do clean run for each test. 
    browser.manage().deleteAllCookies(); 
    browser.executeScript('window.sessionStorage.clear(); window.localStorage.clear();').then(
     undefined, 
     function (err) { 
      // Errors will be thrown when browser is on default data URL. 
      // Session and Local storage is disabled for data URLs 
      // This callback is needed to not crash test, and just ignore error. 
     }); 

    browser.manage().timeouts().implicitlyWait(5000); // I even rewrite implicit wait back to default value, in case i touched it in tests 

    // Also you might want to clear indexdb storage after tests. 
    }) 

실제 코드에서 내가 문제는이 같은 resetBrowser 또는 뭔가를 호출 된 함수로 포장합니다. 또한 약속을 되돌릴 수 있고 그 약속을 후크에서 반환 할 수 있습니다. 그래서 새로운 시험은 약속이 해결 될 때까지 시작하지 않을 것입니다.

+1

오, 세상에 'afterEach'는 아마도 지금까지 최선의 아이디어 일 것입니다. 고마워, Хотабыч! – alecxe

4

동일한 시나리오로 어려움을 겪고있는 어느 시점에서 필자는 도우미 함수를 만들어서 새 페이지로 이동하기 전에 호출했습니다. 함수를 호출하기 위해서는 여전히 "기억"해야하지만 최소한이 변경을 처리하는 곳에서는 코드에서 한 곳만 제공됩니다.

isAngularSite(flag) { 
    browser.ignoreSynchronization = !flag; 
} 

그리고 심지어 전환하는 것을 잊었다 그래서 만약 내 코드에서 나는, 나는 그것의 시작 상태로 모든 설정 utils.isAngularSite(false);