2017-09-05 11 views
0

私は立ち往生午前ユニットは、角4コンポーネントのテスト中にエラーを取得しておく「はTypeError未定義のプロパティを読み取ることができませんが 『購読します』」。角度4ユニット・テスト・エラー:

ここに私のコンポーネントです:

order.service.ts

@Injectable() 
export class OrderService { 
    private ordersUrl = `${environment.apiUrl}/orders/`; 

    constructor(private http: HttpClient) {} 

    getOrder(id: number): Observable<Order> { 
    return this.http.get(`${this.ordersUrl}${id}/`) 
     .map(response => response as Order); 
    } 
} 

ため、detail.component.ts

@Component({ 
    selector: 'order-detail', 
    templateUrl: 'order-detail.component.html', 
    providers: [OrderService] 
}) 
export class OrderDetailComponent implements OnInit { 
    private order: Order; 

    constructor(
    private orderService: OrderService, 
    private route: ActivatedRoute, 
    private router: Router 
) {} 

    ngOnInit() { 
    this.getOrder(); 
    } 

    private getOrder(): void { 
    this.route.paramMap 
     .map((params: ParamMap) => { 
     if (+params.get('id') === 0) { 
      this.router.navigateByUrl('/404', {skipLocationChange: true}); 
     } 

     return params; 
     }) 
     .switchMap((params: ParamMap) => this.orderService.getOrder(+params.get('id'))) 
     .subscribe((order: Order) => this.order = order); 
    } 
} 

そして、ここではサービスです

そして、私はそのような試験でOrderServiveとユニットテスト、それにスパイを設定したい:

ため、detail.component.spec.ts

describe('Order detail component',() => { 
    let fixture: ComponentFixture<OrderDetailComponent>; 
    let page: Page; 
    let activatedRoute: ActivatedRouteStub; 
    const fakeOrder: Order = { 
    id: 1, 
    title: 'Test 1', 
    contractor: {title: 'Contractor 1'} as Contractor, 
    } as Order; 

    class Page { 
    orderSpy: jasmine.Spy; 
    routerSpy: jasmine.Spy; 
    title: HTMLElement; 

    constructor() { 
     const orderService = fixture.debugElement.injector.get(OrderService); 
     this.orderSpy = spyOn(orderService, 'getOrder').and.returnValue(Observable.of(fakeOrder)); 
    } 
    } 

    function createComponent() { 
    fixture = TestBed.createComponent(OrderDetailComponent); 
    page = new Page(); 

    fixture.detectChanges(); 

    return fixture.whenStable().then(() => { 
     fixture.detectChanges(); 
    }); 
    } 

    beforeEach(() => { 
    activatedRoute = new ActivatedRouteStub(); 
    }); 

    beforeEach(async(() => { 
    TestBed.configureTestingModule({ 
     declarations: [OrderDetailComponent], 
     imports: [RouterTestingModule, HttpClientTestingModule], 
     providers: [ 
     OrderService, 
     {provide: ActivatedRoute, useValue: activatedRoute}, 
     {provide: Router, useClass: RouterStub}, 
     ], 
     schemas: [NO_ERRORS_SCHEMA], 
    }).compileComponents(); 
    })); 

    describe('when navigate with existing id',() => { 
    beforeEach(async(() => { 
     activatedRoute.testParamMap = {id: fakeOrder.id}; 
     createComponent(); 
    })); 

    it('should show title',() => { 
     expect(page.orderSpy).toHaveBeenCalledWith(fakeOrder.id); 
    }); 
    }); 

}); 

をしかし、私はこのエラーを取得しておいてください。TypeError: Cannot read property 'subscribe' of undefined

私はAgularのドキュメントから ActivatedRouteStubとテスト構造を取っ

https://angular.io/guide/testing

コンポーネントのコードは、バックエンドからの実際のデータで正常に動作します私に注文を表示します。

また、私のコードベースが正常に同様のサービスを別のコンポーネントに同じことを行い同様の試験が含まれているので、このテストは失敗した唯一の場所です。角度4.3.6、1.7.1カルマとジャスミン2.6.4を使用して

。間違って行くことができる何とこのエラーを取り除くためにどのよう

答えて

1

は、いくつかの研究の後、私は実際にはエラーの原因を考え出しました。削除しました

{provide: Router, useClass: RouterStub}, 

エラーがなくなりました。テストは現在、このスタブなしで完全に動作しています。

問題だったが、私はドキュメントからRouterStubクラスがいくつか必要なものの実装が欠落していることを前提とわかりません。クラスはここから取られました:

https://angular.io/guide/testing#test-a-routed-component

https://angular.io/generated/live-examples/testing/app-specs.eplnkr.html