2017-05-24 1 views
1

아래에 ngrx/effects 클래스가 있습니다. 테스트 해보고 싶지만 테스트를 실행할 때 아무 것도 인쇄하지 않고 통과합니다. 나는 액션 TRIGGER_LOAD_NAVIGATION_ITEMS를 실행할 때 LOAD_NAVIGATIONS_LINKSangular2에서 ngrx/effects 클래스를 테스트하는 방법은 무엇입니까?

효과가

import { Injectable } from '@angular/core'; 
import { Effect, Actions } from '@ngrx/effects'; 
import { NavigationActionType } from 'app/core/store/actions/navigation/navigation.action'; 
import { NavigationService } from 'app/core/services/navigation.service'; 
import 'rxjs/add/operator/switchMap'; 

@Injectable() 
export class NavigationServiceEffect { 
    @Effect() 
    navigations$ = this.actions$ 
         .ofType(NavigationActionType.TRIGGER_LOAD_NAVIGATION_ITEMS) 
         .switchMap(() => this.navigationService.load()) 
         .map(data => ({ type: NavigationActionType.LOAD_NAVIGATIONS_LINKS, payload: data})); 

    constructor(private actions$: Actions, private navigationService: NavigationService) {} 
} 

테스트 파일

import { Http, Request, RequestOptionsArgs } from "@angular/http"; 
import { RouterModule, Router } from "@angular/router"; 


class HttpMock extends Http { 

    get(url: string, options?: RequestOptionsArgs): any { 

    } 

    request(url: string | Request, options?: RequestOptionsArgs): any { 

    } 
} 

fdescribe('Tag Effect',() => { 
    let runner: EffectsRunner; 
    let navEffects: NavigationServiceEffect; 
    let navService: NavigationService; 
    let actions: Actions; 

    beforeEach(() => TestBed.configureTestingModule({ 
     imports: [ 
      EffectsTestingModule, 
      RouterModule, 
      StoreModule.provideStore(reducers()) 
     ], 
     providers: [ 
      Actions, 
      NavigationService, 
      HttpService, 
      { provide: Http, useClass: HttpMock }, 
      { provide: Router, useClass: class { navigate = jasmine.createSpy("navigate"); } } 
     ] 
    })); 

    it('Call Load Navigation items action after Trigger Load aciton', 
     inject([ 
      Actions, NavigationService 
     ], 
      (_actions, _navService) => { 
       actions = _actions; 
       navService = _navService; 

       spyOn(navService, 'load') 
        .and.returnValue(Observable.of([ 
         { "name": "Help", "hasChild": false, "roles": [101, 151, 201, 301, 401], "url": "help" } 
        ])); 


       navEffects = new NavigationServiceEffect(actions, navService); 

       navEffects.navigations$.subscribe(r => console.log(r)); 

       navEffects.navigations$.subscribe(result => { 

        console.log(result); 
        expect(result.type).toEqual(NavigationActionType.LOAD_NAVIGATIONS_LINKS); 
        expect(result.payload.length).toEqual(3); // This should fail 

       }); 
      })); 

}); 

테스트 파일로 테스트가 나는 결과 집합을 조롱하고 작업 유형을 반환받을해야해야 위의 문장에서 예상되는 페이로드의 길이가 1이고 3과 같으면 실패해야하므로 실패해야합니다. 그러나 테스트는 통과하지만 콘솔 출력은 기록되지 않습니다. 위 파일을 어떻게 테스트 할 수 있습니까?

답변

1

귀하의 주장은 subscribe 안에 정의되어 있으므로 귀하의 테스트는 비동기이됩니다.
사실 액션 테스트가 시작되기 전에 테스트가 끝난 것일 수 있습니다.
는이 같은 async 기능 테스트를 마무리하기 위해 필요한이 해결하려면 :

it('Call Load Navigation items action after Trigger Load aciton', 
     async(
     inject([ 
      Actions, NavigationService 
     ], 
      (_actions, _navService) => { 
       actions = _actions; 
       navService = _navService; 

       spyOn(navService, 'load') 
        .and.returnValue(Observable.of([ 
         { "name": "Help", "hasChild": false, "roles": [101, 151, 201, 301, 401], "url": "help" } 
        ])); 


       navEffects = new NavigationServiceEffect(actions, navService); 

       navEffects.navigations$.subscribe(r => console.log(r)); 

       navEffects.navigations$.subscribe(result => { 

        console.log(result); 
        expect(result.type).toEqual(NavigationActionType.LOAD_NAVIGATIONS_LINKS); 
        expect(result.payload.length).toEqual(3); // This should fail 

       }); 
      }))); 

hereasync에 대한합니다.

관련 문제