2017-05-21 3 views
0

나는각도 테스트 스텁 및 타이프 라이터

let component: MyComponent; 
let fixture: ComponentFixture<MyComponent>; 
let activatedRoute: ActivatedRouteStub; 

beforeEach(async(() => { 
    TestBed.configureTestingModule({ 
     declarations: [MyComponent], 
     providers: [ 
      {provide: ActivatedRoute, useClass: ActivatedRouteStub}, 
      {provide: Router, useClass: RouterStub} 
     ] 
    }); 
})); 

beforeEach(() => { 
    fixture = TestBed.createComponent(MyComponent); 
    component = fixture.componentInstance; 
    activatedRoute = fixture.debugElement.injector.get(ActivatedRoute); 
    activatedRoute.testParams = { email: email}; 
    fixture.detectChanges(); // calls ngOnInit 
}); 

testing guide 다음이었다 내 테스트 중 하나를 설정을 다음 한 같은 곳

@Injectable() 
export class ActivatedRouteStub { 
    // ActivatedRoute.params is Observable 
    private subject = new BehaviorSubject(this.testParams); 
    params = this.subject.asObservable(); 

    // Test parameters 
    private _testParams: {}; 
    get testParams() { return this._testParams; } 
    set testParams(params: {}) { 
     this._testParams = params; 
     this.subject.next(params); 
    } 

    // ActivatedRoute.snapshot.params 
    get snapshot() { 
     return { params: this.testParams }; 
    } 
} 

이었다 모두 내가에 npm install을 수행 할 때까지 잘 transpiling 패키지 업데이트 (각도 4 및 타이프 스크립트) 이제 다음과 같은 오류가 발생합니다.

TS2322: Type 'ActivatedRoute' is not assignable to type 'ActivatedRouteStub'. 
    Property 'subject' is missing in type 'ActivatedRoute'. 

TS2339: Property 'parent' does not exist on type 'ActivatedRouteStub'. 

왜 갑자기 이러한 오류가 발생하는지 알고 싶습니다.

+0

이전 버전의 각도 및 Typescript가 얼마나 달라졌는지에 따라 달라 졌는지 설명 할 수 없습니다. 그러나 오류는 다음과 같이 간단하게 해결할 수 있습니다 : a) 스터브 된 클래스의'subject' 속성을 공용 변수로 만들고, b) 스텁 된 클래스에'parent' 속성을 추가하십시오. 그러나, 나는 테스트를 작성하는 더 좋은 방법에 걸림돌이있다. 스텁 클래스를 제거하고'RouterTestingModule'을 사용할 수있다. 그냥 당신의 테스트를 용이하게하는 경우 그냥 추측 ... –

+0

'Router'와'ActivatedRoute'에 대한 개별 제공자를 선언하는 대신 테스트 베드 구성에'imports : [RouterTestingModule] '을 추가하면 필요성을 줄일 수 있습니다 스텁의 경우. 소금 한알을 가져 가라. 나는 Angular2/Angular4로 테스트하면서 내 머리를 감싸고있다. –

+0

@ Sun Di. RouterTestingModule에는'ActivatedRoute' 스텁이 없습니다. 불행히도 당신은 여전히 ​​수동으로 조롱을해야합니다. https://angular.io/guide/testing을 참조하십시오. –

답변

0

ActivatedRoute 클래스를 검색하고 ActivatedRouteStub에 할당하는 중 문제가 발생했습니다. 수정 사항은 다음과 같습니다.

let activatedRoute: ActivatedRouteStub; 
... 
activatedRoute = fixture.debugElement.injector.get(ActivatedRoute) as any;