codememo

일부 테스트에서 페이지 전체를 새로고침했습니다.Jasmine 테스트 실행 중 오류가 발생했습니다.

tipmemo 2023. 3. 19. 18:17
반응형

일부 테스트에서 페이지 전체를 새로고침했습니다.Jasmine 테스트 실행 중 오류가 발생했습니다.

Jasmine에서 테스트를 실행하면 아래와 같은 오류가 발생하는 문제가 발생했습니다.문제는 어느 정도의 테스트를 실행하려고 할 때 발생하는 것 같다는 것입니다.특정 테스트에 얽매이지 않는 것 같습니다만, 몇 가지 코멘트를 하는 것처럼, 테스트는 합격입니다.몇 가지 테스트의 코멘트를 해제하면 에러가 표시됩니다.전에 코멘트하지 않았던 것을 코멘트하면, 모두 다시 합격합니다.(즉, 빨간색, 녹색, 파란색 및 주황색 테스트가 실패하면 주황색과 파란색으로 코멘트 아웃하고 파란색과 주황색으로 코멘트 아웃하면 다시 실패합니다만 빨간색과 녹색으로 코멘트 아웃하면 다시 패스합니다).

Chrome 41.0.2272(Mac OS X 10.10.1) 오류 일부 테스트에서 페이지 전체를 새로고침했습니다!Chrome 41.0.2272 (Mac OS X 10.10.1):29개 중 16개(1개 실패) 오류(0.108초/0.092초) 실행.

나는 무슨 일이 일어나고 있는지 모르겠다.더 많은 테스트를 추가할수록 문제가 됩니다.누가 이걸 본 적 있어요?어떤 테스트도 리다이렉션을 하지 않고 모두 다른 사람의 머신에 공통적으로 전달되기 때문에 원인이 무엇인지 알 수 없습니다.

제 경우, 소스코드에 window.location과 같은 로케이션 오브젝트에 href를 직접 설정하는 코드가 있었습니다.href = '최소';

내 사양에서는 리다이렉트를 실행하는 대신 문자열을 반환하는 온 언로드 리스너를 설정합니다.

beforeAll(() => {
  window.onbeforeunload = () => 'Oh no!';
});

사용하시는 것 같습니다.window.location타겟 코드의 어딘가에 있습니다.그걸 통과시키려면 그냥 스파이를 만들어window.onbeforeunload

예:

window.onbeforeunload = jasmine.createSpy();

또는 더 나은 사용$window대신, 이런 일은 일어나지 않을 거야.

테스트 대상 모듈이 모두 모크 또는 스파이로 올바르게 격리되어 있는지 확인합니다.이 동작은 테스트가 실제로 단독으로 실행되고 있지 않다는 것을 나타냅니다.테스트는 새로고침이 트리거되는 상태를 변화시키고 있습니다.

최근 Karma 0.13.12에서 이 오류가 발생했습니다.Karma 0.13.14로 업그레이드하여 다시 테스트가 작동합니다.저에게 있어서 (아마도 @mqklin에게도) 문제는 https://github.com/karma-runner/karma/issues/1656 및 https://github.com/jasmine/jasmine/issues/945과 관련된 문제였을 것입니다.

이 오류는 여러 가지 방법으로 발생할 수 있습니다.

구성 요소에 양식 요소가 있는 경우 이것이 원인일 수 있습니다.

양식에 있는 단추를 누를 때마다 이 오류가 발생할 수 있습니다. 구성 요소에 네비게이션 로직이 없는 경우에도 마찬가지입니다.

저는 Karma를 1.4.0에서 1.4.1로 업그레이드하고 jasmine.js 파일의 maximumSpecCallbackDepth를 20에서 100으로 변경한 것이 효과가 있었습니다.

window.location/reload가 있는 함수에 대한 스파이 생성으로 문제가 해결되었습니다.

또한 모듈이 두 번 로드되지 않았는지 확인해야 합니다.가 있었어요. - JS 모듈 파일 - 、auth.controller.js 는 어떤 입니까?core.js파일입니다. 카르마에서 번들 파일을 제외하자 오류가 사라졌습니다.

을 노력하세요describe완전히 제거할 수 있습니다.왜 그랬는지 모르겠지만, 나한테는 효과가 있어.

는 용 i i용었 i i i i i 。setTimeout(() => window.location.replace('/'), 10);유닛 테스트에서 아래 코드를 사용했는데 효과가 있었습니다.

spyOn(global, 'setTimeout');

.window.location = "some url"유사한 문제에 직면하여 아래 변경 사항을 사용하여 해결합니다.

코드의 window.location을 다음과 같이 치환하십시오.

window.location.assign("some url");

다음 유닛 테스트를 수행합니다.

spyOn(window.location, "assign").and.callFake(() => {
    // Dummy assign call - so that your actual call will be faked and the reload will not happen. 
});

ng-submit 콜백일 경우 event.preventDefault()를 호출하지 않고 브라우저 새로고침 페이지가 나타납니다.$location을 조롱하는 것은 이 상황에서 도움이 되지 않습니다.

angularjs 문서에 따르면 테스트 가능성 문제를 해결하려면 $window 모듈을 삽입해야 합니다.라우팅 중에 페이지 전체를 새로 고치는 경우 전체 응용 프로그램이 새로고침됩니다.근데 어쨌든...

예를 들어 컴포넌트에서는

.controller('ExampleController', ['$scope', '$window', function($scope, $window**) 
 {

      $scope.doRerouteWithPageReload = function() {
       return this.$window.location.href = "/myUrl";
 };

그런 다음 테스트 파일에서 $window를 테스트 컨트롤러로 Import하면 다음과 같은 작업을 수행할 수 있습니다.

$window = { location: {href: jasmine.createSpy() };

그리고 실제 테스트는 다음과 같습니다.

expect($window.location.href).toBe("/myUrl");

$window에 대한 자세한 내용은 Angularjs 문서를 참조하십시오.

카르마 리다이렉트 오류를 해결합니다!

var html = '<script type="text/javascript">';
html += 'window.location = "' + urlToRedirect +'"';
html += '</script>';
$( '.wrapper' ).append( html );

언급URL : https://stackoverflow.com/questions/29352578/some-of-your-tests-did-a-full-page-reload-error-when-running-jasmine-tests

반응형