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'.
왜 갑자기 이러한 오류가 발생하는지 알고 싶습니다.
이전 버전의 각도 및 Typescript가 얼마나 달라졌는지에 따라 달라 졌는지 설명 할 수 없습니다. 그러나 오류는 다음과 같이 간단하게 해결할 수 있습니다 : a) 스터브 된 클래스의'subject' 속성을 공용 변수로 만들고, b) 스텁 된 클래스에'parent' 속성을 추가하십시오. 그러나, 나는 테스트를 작성하는 더 좋은 방법에 걸림돌이있다. 스텁 클래스를 제거하고'RouterTestingModule'을 사용할 수있다. 그냥 당신의 테스트를 용이하게하는 경우 그냥 추측 ... –
'Router'와'ActivatedRoute'에 대한 개별 제공자를 선언하는 대신 테스트 베드 구성에'imports : [RouterTestingModule] '을 추가하면 필요성을 줄일 수 있습니다 스텁의 경우. 소금 한알을 가져 가라. 나는 Angular2/Angular4로 테스트하면서 내 머리를 감싸고있다. –
@ Sun Di. RouterTestingModule에는'ActivatedRoute' 스텁이 없습니다. 불행히도 당신은 여전히 수동으로 조롱을해야합니다. https://angular.io/guide/testing을 참조하십시오. –