角度单元测试TypeError:无法读取未定义的属性“订阅”

时间:2018-12-10 09:37:35

标签: javascript angular unit-testing frontend karma-jasmine

我正在使用auth创建一个入门工具包模板,并使用CRUD(https://github.com/fransyozef/basic-login-angular)创建一个示例

现在,我是单元测试的新手,我正在努力使创建组件的测试至少运行。但是我陷入了

TypeError: Cannot read property 'subscribe' of undefined

我认为错误来自

  resolveRoute() {
    this.route.params.subscribe(params => {
      if (params['id']) {
        this.id = +params['id'];
        this.getItem();
      } else {
        this.handleItemNotFound();
      }
     });
  }

文件https://github.com/fransyozef/basic-login-angular/blob/master/src/app/items/item-edit/item-edit.component.ts

现在我有了testfile: https://github.com/fransyozef/basic-login-angular/blob/master/src/app/items/item-edit/item-edit.component.spec.ts

有人可以帮我吗?

1 个答案:

答案 0 :(得分:1)

您应该模拟自己的路由策略。如我所见,您在routingModule中使用了TestBed imports。假设您的拥有 routingModule仅提供您自己的路线,而无法模拟/监视其他路线。因此,我鼓励您先在Test helper routes内调整test.helper.ts

export const TestRoutingImports = [
  HttpClientTestingModule,
  RouterTestingModule, // <-- Use RouterTestingModule instead
]; 
  

(RouterTestingModule)模块设置要用于测试的路由器。它提供了Location,LocationStrategy和NgModuleFactoryLoader的间谍实现。

RouterTestingModule提供模拟,而RouterModule不提供模拟。

您应该做的第二件事是从测试平台上删除provide。这里没有必要。我的意思是以下部分:

{
  provide: ActivatedRoute, useValue: {
     snapshot: { params: { id: 1 } }
  }
},

删除此内容,因为这将是组件提供程序的替代。在您的情况下,则不需要。

希望我能为您提供帮助。