programing

재스민:비동기 콜백이 재스민에 의해 지정된 타임아웃 내에 호출되지 않았습니다.디폴트_타임아웃_간격

goodcopy 2023. 3. 19. 21:08
반응형

재스민:비동기 콜백이 재스민에 의해 지정된 타임아웃 내에 호출되지 않았습니다.디폴트_타임아웃_간격

난난 called called called called라는 .requestNotificationChannel:

app.factory("requestNotificationChannel", function($rootScope) {

    var _DELETE_MESSAGE_ = "_DELETE_MESSAGE_";

    function deleteMessage(id, index) {
        $rootScope.$broadcast(_DELETE_MESSAGE_, { id: id, index: index });
    };

    return {
       deleteMessage: deleteMessage
    };

});

Jasmine을 사용하여 이 서비스를 테스트하려고 합니다.

"use strict";

describe("Request Notification Channel", function() {
    var requestNotificationChannel, rootScope, scope;

    beforeEach(function(_requestNotificationChannel_) {
        module("messageAppModule");

        inject(function($injector, _requestNotificationChannel_) {
            rootScope = $injector.get("$rootScope");
            scope = rootScope.$new();
            requestNotificationChannel = _requestNotificationChannel_;
        })

        spyOn(rootScope, '$broadcast');
    });


    it("should broadcast delete message notification", function(done) {

        requestNotificationChannel.deleteMessage(1, 4);
        expect(rootScope.$broadcast).toHaveBeenCalledWith("_DELETE_MESSAGE_", { id: 1, index: 4 });
        done();       
    });
});

Jasmine의 Asynchronous Support에 대해 읽었는데, javascript를 사용한 유닛 테스트는 처음이라 제대로 되지 않았습니다.

에러가 발생하고 있습니다.

Async callback was not invoked within timeout specified by jasmine.DEFAULT_TIMEOUT_INTERVAL

테스트 시간이 너무 오래 걸립니다(5초 정도).

누가 설명과 함께 내 코드의 실행 예를 제공하는 것을 도와줄 수 있나요?

itdone재스민

//this block signature will trigger async behavior.
it("should work", function(done){
  //...
});

//this block signature will run synchronously
it("should work", function(){
  //...
});

그게 무슨 상관이야?done인수는 명명되고 그 존재가 중요한 것이다.복사/파스타를 너무 많이 해서 이 문제에 부딪혔습니다.

Jasmine Asynchronous Support 문서에서는 이 인수(이름 지정)에 주목하고 있습니다.done위의)는 비동기 함수가 완료되면 Jasmine에게 통지하기 위해 호출할 수 있는 콜백입니다.전화를 걸지 않으면 재스민은 테스트가 끝난 것을 알 수 없게 되어 결국 타임아웃이 됩니다.

이 경우 비동기 테스트에서도 타임아웃이 발생합니다.제한 타임아웃 값을 늘려 비동기 재스민 콜백을 평가할 수 있습니다.

describe('Helper', function () {
    var originalTimeout;

    beforeEach(function() {
        originalTimeout = jasmine.DEFAULT_TIMEOUT_INTERVAL;
        jasmine.DEFAULT_TIMEOUT_INTERVAL = 1000000;
    });

    afterEach(function() {
      jasmine.DEFAULT_TIMEOUT_INTERVAL = originalTimeout;
    });

    it('Template advance', function(doneFn) {
        $.ajax({
            url: 'public/your-end-point.mock.json',
            dataType: 'json',
            success: function (data, response) {
                // Here your expected using data
                expect(1).toBe(1)
                doneFn();
            },
            error: function (data, response) {
                // Here your expected using data
                expect(1).toBe(1)
                doneFn();
            }
        });
    });
});

출처 : http://jasmine.github.io/2.0/introduction.html#section-42

이 오류는 서비스/공장 초기화 시 주입을 생략한 경우에도 발생할 수 있습니다.예를 들어, 다음과 같이 송신할 수 있습니다.

var service;
beforeEach(function(_TestService_) {
    service = _TestService_;
});

이 문제를 해결하려면 기능을 주입으로 랩하여 서비스를 올바르게 가져옵니다.

var service;
beforeEach(inject(function(_TestService_) {
    service = _TestService_;
}));
import { fakeAsync, ComponentFixture, TestBed } from '@angular/core/testing';

fake Async 사용

beforeEach(fakeAsync (() => {

//your code

}));



describe('Intilalize', () => {
        it('should have a defined component', fakeAsync(() => {
            createComponent();
            expect(_AddComponent.ngOnInit).toBeDefined();
        }));
    });

카르마 재스민 플러그인을 사용하여 기본 타임아웃 간격을 글로벌하게 설정할 수 있습니다.

이 설정을 카르마.conf.js에 추가합니다.

module.exports = function(config) {
  config.set({
    client: {
      jasmine: {
        timeoutInterval: 10000
      }
    }
  })
}

이 에러는 항상 효과가 있던 테스트에서 갑자기 시작되었습니다.맥북의 동작이 느리다는 것을 깨닫기 전까지는 도움이 되는 제안을 찾을 수 없었습니다.CPU가 다른 프로세스에 의해 피깅되어 있는 것을 깨달았습니다.그 때문에 CPU가 정지되었습니다.재스민 비동기 오류는 사라졌고 내 테스트는 다시 정상입니다.

이유는 묻지 마, 나도 몰라.하지만 제 상황에서는 시스템 리소스 부족이 원인인 것 같습니다.

이것은 대답이라기보다 관찰에 가깝지만, 저처럼 좌절했던 다른 사람들에게 도움이 될 수도 있습니다.

스위트룸의 두 가지 테스트에서 이 오류가 계속 발생했습니다.단순히 리팩터링으로 테스트를 망쳤다고 생각했기 때문에 변경을 취소한 후 이전 코드로 되돌아가 오류를 없앨 수 있을 것 같아서 두 번 (리비전 2번) 되돌렸습니다.그렇게 해도 아무것도 변하지 않았다.어제 하루 종일 꽁무니만 쫓았고, 오늘 아침은 이 문제를 해결하지 못했다.

나는 좌절해서 오늘 아침에 노트북으로 코드를 확인했어.테스트 스위트 전체 실행(약 180개 테스트), 오류 없음.그럼 오류는 코드나 테스트에 없었던 거군요개발 박스로 돌아와, 재기동하고, 문제의 원인이 되고 있는 메모리의 모든 것을 클리어.변경은 없고, 같은 2개의 테스트에서 같은 에러가 발생합니다.그래서 저는 제 기계에서 디렉토리를 삭제하고 다시 체크 아웃했습니다.부일라! 틀림없어.

원인이나 수정 방법은 알 수 없지만 작업 디렉토리를 삭제하고 체크 아웃하면 문제가 해결되었습니다.

이게 도움이 됐으면 좋겠네요.

이는 '아까', '아까', '아까', '아까', '아까', '아까', '아까', '아까', '아까', '아까', '아까', '아까', '아까', '아'beforeAll기!!

describe('...', function () {

    beforeAll(function () {
        ...

        expect(element(by.css('[id="title"]')).isDisplayed()).toBe(true);
    });

    it('should successfully ...', function () {

    }
}

마세요done함수 호출은 비워두기만 하면 됩니다.

테스트에서는 콜백이 발생하지 않을 때까지 대기하고 있는 것 같습니다.비동기 동작으로 테스트가 실행되지 않기 때문일 수 있습니다.

먼저 "it" 시나리오에서 fakeAsync를 사용하는지 확인합니다.

it('should do something', fakeAsync(() => {

이 경우에도 하실 수 있습니다.flush()하거나 microTask 큐 또는 microTask 큐를 기다리다tick()지정된 시간 동안 대기합니다.

제 경우, 이 에러는 "fluse"를 잘못 사용했기 때문에 발생합니다.detect Changes()" 이 메서드는 변경이 검출되었을 때만 콜백에 응답하는 이벤트청취자(async)인 것 같습니다.변경이 검출되지 않으면 콜백이 호출되지 않고 타임아웃에러가 발생합니다.이것이 도움이 되기를 바랍니다:)

를 제거한 후 동작합니다.scope'이것'은 다음과 같습니다.

"use strict";

describe("Request Notification Channel", function() {
    var requestNotificationChannel, rootScope;

    beforeEach(function() {
        module("messageAppModule");

        inject(function($injector, _requestNotificationChannel_) {
            rootScope = $injector.get("$rootScope");
            requestNotificationChannel = _requestNotificationChannel_;
        })
        spyOn(rootScope, "$broadcast");
    });


    it("should broadcast delete message notification with provided params", function() {
        requestNotificationChannel.deleteMessage(1, 4);
        expect(rootScope.$broadcast).toHaveBeenCalledWith("_DELETE_MESSAGE_", { id: 1, index: 4} );
    });
});

실행한 작업: 다음 코드 추가/업데이트:

framework: 'jasmine',
jasmineNodeOpts: 
{
    // Jasmine default timeout
    defaultTimeoutInterval: 60000,
    expectationResultHandler(passed, assertion) 
    {
      // do something
    },
}

@mastablasta에서 알 수 있듯이 'done' 인수를 호출하거나 이름을 붙이면 테스트가 완료되면 callback completed()를 호출할 수 있습니다.

// this block signature will trigger async behavior.
it("should work", function(done){
  // do stuff and then call done...
  done();
});

// this block signature will run synchronously
it("should work", function(){
  //...
});

재스민디폴트_타임아웃_INTERVAL = 100000;

이걸 블록에 넣어두면 내 문제가 해결됐어.

it('', () => {
 jasmine.DEFAULT_TIMEOUT_INTERVAL = 100000;
});

대신

beforeEach(() => {..

사용하다

beforeEach(fakeAsync(() => {..

이 경우, 타임아웃이 발생한 것은, 에 의한 서비스 주입에 실패했기 때문입니다.providedIn: 'root'사용 가능한 프로바이더의 인스턴스가 없는 것 같으면 주입에 실패한 이유와 초기 오류가 없었던 이유는 명확하지 않습니다.

값을 수동으로 입력하여 문제를 해결할 수 있었습니다.

TestBed.configureTestingModule({
  declarations: [
    // ...
  ],
  imports: [
    // ...
  ],
  providers: [
    // ...
    { provide: MyService, useValue: { /* ... */ } },
  ]
}).compileComponents();

같은 에러가 검출된 것은, 이 에러를 사용하고 있기 때문입니다.setTimeout컴포넌트에서 기능합니다.예:

  ngOnInit(): void {
    this.changeState();
  }
  
  private changeState(): void {
    setTimeout(() => this.state = StateEnum.IN_PROGRESS, 10000);
  }

변경했을 때timeout10000ms ~0 또는 5000ms 미만(DEFAULT_TIMEOUT_)INTERVAL)은 모든 테스트에 합격했습니다.

제 경우, spy method에서 값을 반환하지 않았기 때문에 오류가 발생했습니다.

        mainMethod(args): Observable<something>{
            return nestedMethod().pipe();
        }

테스트는 다음과 같습니다.

        it('your test case', (done: DoneFn) => {
         const testData = {}; // Your data    
         spyOn(service, 'nestedMethod').and.returnValue(of(testData));
         const obxValue = service.mainMethod('your args');

         obxValue.pipe(first()).subscribe((data) => {
            expect(data).not.toBeUndefined();
            done();
         });
       });

말다툼이 있는 경우(done)의it함수는 함수 자체 내에서 호출도 제거하려고 합니다.

it("should broadcast delete message notification", function(/*done -> YOU SHOULD REMOVE IT */) {

    requestNotificationChannel.deleteMessage(1, 4);
    expect(rootScope.$broadcast).toHaveBeenCalledWith("_DELETE_MESSAGE_", { id: 1, index: 4 });
    // done(); -> YOU SHOULD REMOVE IT        
});

언급URL : https://stackoverflow.com/questions/22604644/jasmine-async-callback-was-not-invoked-within-timeout-specified-by-jasmine-defa

반응형