【问题标题】:Cannot read property 'params' of undefined in angular 2无法读取角度 2 中未定义的属性“参数”
【发布时间】:2017-08-31 05:06:17
【问题描述】:

我们在代码中使用了路由参数。但是在 jasmine karma 中执行单元测试时,我们遇到了以下错误。

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();
    });

}

【问题讨论】:

    标签: unit-testing angular karma-jasmine karma-coverage routeparams


    【解决方案1】:

    改变

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

    到:

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

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

    【讨论】:

      【解决方案2】:

      我使用下面的代码及其为我工作的 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();
        }));
      

      【讨论】:

        猜你喜欢
        • 2018-07-19
        • 2023-03-30
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2018-04-15
        • 2016-09-22
        • 2016-07-20
        • 2015-08-10
        相关资源
        最近更新 更多