代码之家  ›  专栏  ›  技术社区  ›  Ramesh Rajendran

对象不支持在\u ActivatedRoute\u 58上执行此操作

  •  1
  • Ramesh Rajendran  · 技术社区  · 7 年前

    我在Angular 2中使用Jasmin和Karma进行单元测试。

    我需要模拟下面的代码

    this.activatedRoute.url.subscribe(url => {
                debugger;
                this.isEdit = false;
                if (url[0].path === 'updatecoc') {
                    this.isEdit = true;
                }
            });
    

    我试过这样嘲笑: How to mock an activatedRoute parent Route in angular2 for testing purposes?

    let fakeActivatedRoute = new MockActivatedRoute();
        fakeActivatedRoute.parent = new MockActivatedRoute();
    
        let urlSegment: UrlSegment[] = [];
        urlSegment.push({ path: "updatecoc", parameters: {} });
        fakeActivatedRoute.url = Observable.of(urlSegment);    
        beforeEach(() => {    
            TestBed.configureTestingModule({
    
                imports: [FormsModule, MessagesModule, DataTableModule, DropdownModule, ConfirmDialogModule, AccordionModule,
                    AutoCompleteModule, DialogModule, EditorModule, HttpModule],
                declarations: [MaintainCOCComponent],
                providers: [{ provide: MaintainCOCService, useClass: MaintainCOCService },
                { provide: Configuration, useClass: Configuration },
                { provide: Router, useClass: MockRouter },
                { provide: ActivatedRoute, useClass: fakeActivatedRoute }];
    

    但我在嘲笑时出错了 ActivatedRoute 单元从两天开始,我什么都试过了。我无法解决这个问题。

    完整错误消息为:

    Object doesn't support this action
       at _ActivatedRoute_58.get (Function code:173:46)
       at DynamicTestModuleInjector.prototype.getInternal (Function code:281:43)
       at NgModuleInjector.prototype.get (http://localhost:9876/base/src/test.ts:60528:9)
       at TestBed.prototype.get (http://localhost:9876/base/src/test.ts:17440:13)
       at AppView.prototype.injectorGet (http://localhost:9876/base/src/test.ts:89000:17)
       at DebugAppView.prototype.injectorGet (http://localhost:9876/base/src/test.ts:89428:13)
       at View_MaintainCOCComponent_Host0.prototype.createInternal (Function code:20:3)
       at AppView.prototype.createHostView (http://localhost:9876/base/src/test.ts:88956:9)
       at DebugAppView.prototype.createHostView (http://localhost:9876/base/src/test.ts:89412:13)
       at ComponentFactory.prototype.create (http://localhost:9876/base/src/test.ts:44498:9)
    

    注: 我应该悬赏给你一个有决心的答案。

    1 回复  |  直到 7 年前
        1
  •  2
  •   Aluan Haddad Vikrant Kashyap    7 年前

    发生此错误的原因是您正在使用 useClass 提供程序选项。

    当喷油器解析 ActivatedRoute 依赖关系,它会看到注册的提供程序具有 使用类别 属性,并尝试将该属性的值实例化为构造函数。

    因为您有一个现有值 fakeActivatedRoute 您可以使用 useValue 而不是属性

    providers: [{provide: ActivatedRoute, useValue: fakeActivatedRoute}]
    

    或者,您可以注册MockActivatedRoute构造函数,而不是创建实例

    providers: [{provide: ActivatedRoute, useClass: MockActivatedRoute}]
    

    此外,您的注册码可以而且应该简化为

    providers: [
      { provide: MaintainCOCService, useClass: MaintainCOCService },
      { provide: Configuration, useClass: Configuration },
      { provide: Router, useClass: MockRouter },
      { provide: ActivatedRoute, useClass: fakeActivatedRoute }
    ]
    

    providers: [
      MaintainCOCService,
      Configuration,
      { provide: Router, useClass: MockRouter },
      { provide: ActivatedRoute, useValue: fakeActivatedRoute }
    ]