1

我们在我们的代码中使用了路由参数。但在执行茉莉花业务中的单元测试时,我们正在收到跟随错误。无法读取角2中未定义的属性'params'

TypeError: Cannot read property 'params' of undefined 
TypeError: Cannot read property 'params' of undefined 
    at Object.<anonymous> (http://localhost:9876/base/src/test.ts:38586:20) 
    at ZoneDelegate.713.ZoneDelegate.invoke (http://localhost:9876/base/src/polyfills.ts:1599:26) 
    at ProxyZoneSpec.onInvoke (http://localhost:9876/base/src/test.ts:82238:39) 
    at ZoneDelegate.713.ZoneDelegate.invoke (http://localhost:9876/base/src/polyfills.ts:1598:32) 
    at Zone.713.Zone.run (http://localhost:9876/base/src/polyfills.ts:1359:43) 
    at Object.<anonymous> (http://localhost:9876/base/src/test.ts:81952:34) 
    at attemptSync (http://localhost:9876/base/node_modules/jasmine-core/lib/jasmine-core/jasmine.js:1950:24) 
    at ZoneQueueRunner.QueueRunner.run (http://localhost:9876/base/node_modules/jasmine-core/lib/jasmine-core/jasmine.js:1938:9) 
    at http://localhost:9876/base/node_modules/jasmine-core/lib/jasmine-core/jasmine.js:1962:16 
    at http://localhost:9876/base/node_modules/jasmine-core/lib/jasmine-core/jasmine.js:1905:9 
    at http://localhost:9876/base/src/test.ts:14790:17 
    at ZoneDelegate.713.ZoneDelegate.invoke (http://localhost:9876/base/src/polyfills.ts:1599:26) 
    at AsyncTestZoneSpec.onInvoke (http://localhost:9876/base/src/test.ts:81547:39) 
    at ProxyZoneSpec.onInvoke (http://localhost:9876/base/src/test.ts:82235:39) 
    at ZoneDelegate.713.ZoneDelegate.invoke (http://localhost:9876/base/src/polyfills.ts:1598:32) 

请找我们的TS文件如下:

import { Component, OnInit, AfterViewInit, EventEmitter, Output } from '@angular/core'; 

export class MyComponent implements OnInit, AfterViewInit { 


    constructor(private route: ActivatedRoute) { 

    } 

    ngOnInit(){ 
     this.route.params.subscribe(params => { 
     this.instanceNumber = params['instanceNumber']; 
     // console.log(`this.instanceNumber--- QS`, this.instanceNumber); 
    }); 
    } 

} 

请在下面找到我们的规范文件:

import { MyComponent } from './MyComponent.component'; 
import { DebugElement, NO_ERRORS_SCHEMA } from '@angular/core'; 
import { async, ComponentFixture, TestBed } from '@angular/core/testing'; 
import { ActivatedRoute, Route, ActivatedRouteSnapshot, UrlSegment, Params, Data } from '@angular/router'; 

describe('MyComponent',() => { 
    let id: string[] = ['123', '456']; 
    let component: MyComponent; 
    let fixture: ComponentFixture<MyComponent>; 


    beforeEach(async(() => { 
     // let route: any = new MockActivatedRoute(); 
     // route.parent = new MockActivatedRoute(); 
     // route.parent.params = Observable.of({ id: 'testId' }); 

     TestBed.configureTestingModule({ 
      imports: [], 
      providers: [{ provide: ActivatedRoute }], 
      declarations: [MyComponent], 
      schemas: [NO_ERRORS_SCHEMA], 
     }) 
      .compileComponents(); 
    })); 

    beforeEach(() => { 
     fixture = TestBed.createComponent(MyComponent); 
     component = fixture.componentInstance; 

     this.route.params.subscribe((params) => { 
      this.instanceNumber = params['12345']; 
     }); 
     fixture.detectChanges(); 
    }); 

} 

回答

2

变化

this.route.params.subscribe((params) => { 
    this.instanceNumber = params['12345']; 
}); 

到:

component.route.params.subscribe((params) => { 
    component.instanceNumber = params['12345']; 
}); 

注意:this对象不会引用正在测试的组件。

0

我使用下面的代码和它的工作为我angular2单元测试。

import { RouterTestingModule } from '@angular/router/testing'; 
import { ActivatedRoute, Route, ActivatedRouteSnapshot, Params} from '@angular/router'; 
import { NO_ERRORS_SCHEMA } from '@angular/core'; 
import { Observable } from 'rxjs/Rx'; 

beforeEach(async(() => { 
    TestBed.configureTestingModule({ 
     declarations: [....], 
     imports: [RouterTestingModule.withRoutes([])], 
     providers: [{ 
     provide: ActivatedRoute, useValue: { 
      params: Observable.of({ id: 3 }), 
      snapshot: { 
      parent: { 
       params: { 
       id: 1 
       } 
      }, 
      paramMap: { 
       get(name: string): string { 
       return ''; 
       } 
      } 
      }, 
     } 
     }], 
     schemas: [NO_ERRORS_SCHEMA] 
    }) 
     .compileComponents(); 
    }));