Angular 2 테스트-비동기 함수 호출-사용시기


89

Angular 2에서 테스트 할 때 TestBed 에서 비동기 기능을 언제 사용 합니까?

언제 사용합니까?

 beforeEach(() => {
        TestBed.configureTestingModule({
            declarations: [MyModule],
            schemas: [NO_ERRORS_SCHEMA],
        });
    });

그리고 언제 이것을 사용합니까?

beforeEach(async(() => {
    TestBed.configureTestingModule({
        declarations: [MyModule],
        schemas: [NO_ERRORS_SCHEMA],
    });
}));

누구든지 이것에 대해 나를 깨달을 수 있습니까?

답변:


97

asyncasync모든 작업 이 완료 될 때까지 다음 테스트가 시작되는 것을 허용하지 않습니다 . 어떤 async일은 모든 비동기 작업이 (예를 들면 지역에 콜백을 포장입니다 setTimeout) 추적됩니다. 모든 비동기 작업이 완료 async되면 완료됩니다.

Angular 외부에서 Jasmine으로 작업 한 적이 있다면 done콜백으로 전달되는 것을 보았을 것입니다.

it('..', function(done) {
  someAsyncAction().then(() => {
    expect(something).toBe(something);
    done();
  });
});

여기에서 이것은 네이티브 Jasmine입니다. 여기에서 Jasmine에을 호출 할 때까지이 테스트가 완료를 지연해야한다고 말합니다 done(). 전화 done()를하지 않고 대신 이렇게했다면 :

it('..', function() {
  someAsyncAction().then(() => {
    expect(something).toBe(something);
  });
});

테스트가 동기 작업 실행을 마친 후에 약속이 해결되기 때문에 예상보다 먼저 테스트가 완료됩니다.

(재스민 환경에서) 각도로, 각도가 실제로 호출 done우리가 사용할 때 뒤에서 async. Zone의 모든 비동기 작업을 추적하고 작업이 모두 완료되면 done배후에서 호출됩니다.

TestBed구성 과 관련된 특정 경우에는 일반적으로 compileComponents. 그렇지 않으면 전화해야 할 상황에 거의 맞지 않습니다.

beforeEach(async(() => {
   TestBed.configureTestingModule({
     declarations: [MyModule],
     schemas: [NO_ERRORS_SCHEMA],
   })
   .compileComponent().then(() => {
      fixture = TestBed.createComponent(TestComponent);
   });
}));

사용하는 구성 요소를 테스트 할 때 templateUrl(웹팩을 사용하지 않는 경우) Angular는 템플릿을 가져 오기 위해 XHR 요청을해야하므로 구성 요소 컴파일이 비동기 적입니다. 따라서 테스트를 계속하기 전에 문제가 해결 될 때까지 기다려야합니다.


1
좋은 대답 @peeskillet. 내가 이해했는지 확인하기 위해 : 인라인 템플릿이 있으면 async필요하지 않습니다. 을 사용 templateUrl하는 경우입니다. 그러나 포함 async은 인라인 템플릿 구성 요소를 "중단"하지 않습니다. async모든 테스트에 기본적으로 사용할 수 있다고 말하는 것이 안전하다고 생각하십니까 ?
vince

2
@vincecampanale templateUrl은 beforeEach에서 구성하는 동안에 만 중요합니다. 어떤 경우에는 compileComponents. 그것이 async당신이 요구하는 것이라면 각 테스트 에서 사용 하는 것과 관련이 없습니다 . 지금까지 (당신이 호출해야 할 때 안전 인 등 compileComponents)를 참조하십시오 내가 전화 compileComponents로 하죠 경우
폴 Samsotha

2
@vincecampanale 테스트 전에 항상 호출하려는 경우는 아닙니다 . 때로는 초기화를 수행 한 후 호출 할 수 있습니다. 호출이 실제로 무엇을하는지 이해해야합니다. 대부분의 경우 괜찮을 것입니다. 그러나 나는 개인적으로 그들이 그 결정을 내리기 위해 스스로를 취한 것을 좋아하지 않습니다. 그러나 나는 많은 사람들이 그것을 부르는 것을 잊는 문제에 직면하고 왜 무언가가 작동하지 않는지 궁금해하는 것을 봅니다. 따라서 호출을 생성하는 것이 더 낫습니다. 위치는 논쟁의 여지가있을 수 있지만, 적어도 그들은 그것을 호출
폴 Samsotha

2
@vincecampanale 일반적으로 뷰를 (재) 렌더링하고 싶을 때 호출해야 할 때입니다. 예를 들어 Create Component-> render view. 그러나 먼저 Create Component-> 렌더링에 사용되는 컴포넌트의 값 변경-> Render View와 같은 것을 먼저 초기화하려면. 나는 어쩌면 무엇을 의미하는 그의를 먼저 뭔가를 초기화 할
폴 Samsotha에게

1
아 그리고 한 가지 더. 처음으로 호출하는 ngOnInit것은 구성 요소에서 호출 될 때 입니다. 테스트 할 때 때때로 이것은 중요한
폴 Samsotha

26

테스트에서 비동기 호출을 할 때 실제 테스트 함수는 비동기 호출이 완료되기 전에 완료됩니다. 호출이 완료되었을 때 일부 상태를 확인해야하는 경우 (일반적으로) 테스트 프레임 워크는 여전히 비동기 작업이 진행되는 동안 테스트가 완료된 것으로보고합니다.

using async(...)을 사용 하면 테스트가 완료된 것으로 처리하기 전에 반환 약속 또는 관찰 가능 항목이 완료 될 때까지 기다리도록 테스트 프레임 워크에 지시합니다.

it('should show quote after getQuote promise (async)', async(() => {
  fixture.detectChanges();

  fixture.whenStable().then(() => { // wait for async getQuote
    fixture.detectChanges();        // update view with quote
    expect(el.textContent).toBe(testQuote);
  });
}));

전달 된 코드 는 테스트 기능 자체가 완료된 후에then(...) 실행 됩니다. 으로 당신이 완료된 것으로 테스트를 치료하기 전에 완료 할 약속과 관찰 가능한 기다릴 필요가, 테스트 프레임 워크를 인식합니다.async()

또한보십시오

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.