【问题标题】:Object doesn't support this action at _ActivatedRoute_58对象在 _ActivatedRoute_58 不支持此操作
【发布时间】:2018-01-22 09:51:24
【问题描述】:

我在 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 模块时出现错误。我已经尝试了 2 天的一切。我无法解决这个问题。

完整的错误信息是:

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)

注意:我应该为已解决的答案提供赏金。

【问题讨论】:

  • fakeActivatedRoute 不是一个函数,所以你在做什么没有意义。您可以使用useValueuseFactory 来注入现有对象。
  • @AluanHaddad 您能否提供答案? fakeActivatedRoute 是一个类的实例。

标签: angular unit-testing typescript jasmine karma-jasmine


【解决方案1】:

发生错误是因为您正在使用useClass 提供程序选项注册现有对象。

当注入器解析 ActivatedRoute 依赖时,它会看到注册的提供者有一个 useClass 属性,并尝试将该属性的值实例化为构造函数。

由于您有一个现有值 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 }
]

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-06-01
    • 2014-12-18
    • 1970-01-01
    • 1970-01-01
    • 2011-05-04
    • 2015-10-24
    • 2019-02-15
    相关资源
    最近更新 更多