无法解决路由器的所有参数:单元测试时Angular RC 5中的(?,?,?,?,?,?,?)

gan*_*jan 44 javascript unit-testing typescript angular2-routing angular

我刚刚升级到Angular RC 5,现在所有使用'ROUTER_DIRECTIVES'的组件都失败了'当我尝试进行单元测试时,无法解析路由器的所有参数:(?,?,?,?,?,?,?)组件.

import { inject, addProviders } from '@angular/core/testing';
import { ComponentFixture, TestComponentBuilder } from '@angular/core/testing';
import { Component } from '@angular/core';
import { ROUTER_DIRECTIVES, Router } from '@angular/router';

import { HomeComponent } from './home.component';
import { UserService } from '../_services/user.service';

describe('Component: Home', () => {

  beforeEach(() => {
    addProviders([HomeComponent, UserService, ROUTER_DIRECTIVES, Router]);
  });  

  it('should inject the component', inject([HomeComponent, UserService, ROUTER_DIRECTIVES, Router],
    (component: HomeComponent) => {
      expect(component).toBeTruthy();
      // expect(component.currentUser.firstname).toEqual('Jan');
    }));
Run Code Online (Sandbox Code Playgroud)

完整的错误日志:

     Chrome 52.0.2743 (Windows 10 0.0.0)
   Error: Can't resolve all parameters for Router: (?, ?, ?, ?, ?, ?, ?).
       at new BaseException (webpack:///C:/ng/anbud/~/@angular/compiler/src/facade/exceptions.js:27:0 <- src/test.ts:2943:23)
       at CompileMetadataResolver.getDependenciesMetadata (webpack:///C:/ng/anbud/~/@angular/compiler/src/metadata_resolver.js:551:0 <- src/test.ts:24542:19)
       at CompileMetadataResolver.getTypeMetadata (webpack:///C:/ng/anbud/~/@angular/compiler/src/metadata_resolver.js:448:0 <- src/test.ts:24439:26)
       at webpack:///C:/ng/anbud/~/@angular/compiler/src/metadata_resolver.js:594:0 <- src/test.ts:24585:41
       at Array.forEach (native)
       at CompileMetadataResolver.getProvidersMetadata (webpack:///C:/ng/anbud/~/@angular/compiler/src/metadata_resolver.js:575:0 <- src/test.ts:24566:19)
       at CompileMetadataResolver.getNgModuleMetadata (webpack:///C:/ng/anbud/~/@angular/compiler/src/metadata_resolver.js:305:0 <- src/test.ts:24296:58)
       at RuntimeCompiler._compileComponents (webpack:///C:/ng/anbud/~/@angular/compiler/src/runtime_compiler.js:150:0 <- src/test.ts:37986:47)
       at RuntimeCompiler._compileModuleAndAllComponents (webpack:///C:/ng/anbud/~/@angular/compiler/src/runtime_compiler.js:78:0 <- src/test.ts:37914:37)
       at RuntimeCompiler.compileModuleAndAllComponentsSync (webpack:///C:/ng/anbud/~/@angular/compiler/src/runtime_compiler.js:52:0 <- src/test.ts:37888:21)
Run Code Online (Sandbox Code Playgroud)

有关如何使用路由单元测试组件的任何想法?

gan*_*jan 44

终于能够解决它,它就像这样简单:

beforeEach(() => addProviders([
    { 
        provide: Router, 
        useClass: class { navigate = jasmine.createSpy("navigate"); }
    }]));
Run Code Online (Sandbox Code Playgroud)

  • 在2.0.0中,这也适用于将其添加到NgModule的providers部分:`providers:[{provide:Router,useClass:class {navigate = jasmine.createSpy("navigate"); `} (6认同)
  • 请更新你的答案,它已经过时了.[`RouterTestingModule`](https://angular.io/api/router/testing/RouterTestingModule)是现在这样做的官方方式. (5认同)
  • 从这里你可以使用茉莉花进行测试.`期望(router.navigate).toHaveBeenCalledWith([ '/成功']);` (2认同)

Jul*_*les 38

对我来说,它可以添加RouterTestingModule

  import { RouterTestingModule } from '@angular/router/testing';

  beforeEach(async(() => {
    TestBed.configureTestingModule({
      imports: [
        RouterTestingModule
      ],
      declarations: [ HomeComponent ]
    })
    .compileComponents();
  }));
Run Code Online (Sandbox Code Playgroud)


mas*_*wok 20

我对上述解决方案没有任何好运.相反,我遵循官方文档中推荐的方法:测试路由组件

首先,使用组件调用的任何方法创建一个存根路由器:

class RouterStub {
  navigateByUrl(url: string) {
    return url;
  }
}
Run Code Online (Sandbox Code Playgroud)

然后,在配置测试模块时,执行以下操作:

TestBed.configureTestingModule({
  declarations: [HeaderComponent],
  providers: [
    {provide: Router, useClass: RouterStub}
  ]
});
Run Code Online (Sandbox Code Playgroud)


Koj*_*nte 16

就我而言,我在提供程序中使用了Router,在导入中使用了RouterTestingModule.猜猜这是造成冲突的原因.以下配置有效:

    TestBed.configureTestingModule({
        declarations: [Component],
        imports: [
            RouterTestingModule,             
        ],
        providers: [
         ...         //Remove Router from providers
        ]              

    });
Run Code Online (Sandbox Code Playgroud)


小智 11

尝试添加RouterModule:

import { ROUTER_DIRECTIVES, Router, RouterModule } from '@angular/router';

beforeEach(() => {
        TestBed.configureTestingModule({
            providers: [
                 ...
                {provide: Router, useClass: RouterModule},
        });
    });
Run Code Online (Sandbox Code Playgroud)

  • 对于某些组件,使用此方法会导致错误"无法实例化循环依赖!路由器("[错误 - >]"):在./DynamicTestModule@-1:1中的NgModule DynamicTestModule中?但是,使用@masterwok的方法有效. (8认同)

Fel*_*ano 8

我只需要从提供商中删除路由器.这对我来说是个问题.


Sid*_*ota 5

I was getting the same error, importing RouterTestModule in my imports array, and removing Router/ActivatedRoute from providers and also removing RouterModule from my imports array helped me to get over this issue.

This is how my working version looks like

import { RouterTestingModule } from '@angular/router/testing';
import { async, ComponentFixture, TestBed } from '@angular/core/testing';
import { FormsModule } from '@angular/forms';
import { MyAppComponent } from './my-apppp.component';
import { MyAppService } from '../../../services/my-app.service';
import { NO_ERRORS_SCHEMA} from '@angular/core';

 beforeEach(async(() => {
    TestBed.configureTestingModule({
      declarations: [ MyAppComponent ],
      schemas:      [NO_ERRORS_SCHEMA],
      imports: [ FormsModule, RouterTestingModule ],
      providers: [ MyAppService ]
    })
    .compileComponents();
  }));
Run Code Online (Sandbox Code Playgroud)

我知道很多人已经在这里发表了评论,但我觉得提供更新的答案会有所帮助。

谢谢!