我如何模拟Angular 2路线?

Jac*_*kie 6 karma-jasmine angular2-routing angular2-testing angular2-router3 angular

我有以下代码......

export class LoginComponent {
    userName: string;
    password: string;
    rememberMe: boolean = false;
    constructor( private auth: AuthenticationService,
                 private router: Router) {
      ...
    }
    ...
}
Run Code Online (Sandbox Code Playgroud)

我正在尝试单元测试,但我的第一次尝试失败了....

beforeEach(() => {
        router = new Router();
        component = new LoginComponent(authService, router);
});
Run Code Online (Sandbox Code Playgroud)

因为它需要Router构造函数的参数.我在这看到 ......

beforeEach(() => addProviders([
    APP_ROUTER_PROVIDERS, // must be first
    {provide: APP_BASE_HREF, useValue: '/'}, // must be second
    {provide: ActivatedRoute, useClass: Mock},
    {provide: Router, useClass: Mock}
]));
Run Code Online (Sandbox Code Playgroud)

但我似乎没有APP_ROUTER_PROVIDERSMock依赖于任何地方,所以我认为它可能是陈旧的(或者我需要依赖).

我该如何嘲笑这个?它对我正在进行的测试并不重要.

jon*_*rpe 8

对于一个简单的情况,您可以创建自己的模拟并按值提供,例如:

describe('whatever', () => {
  let mockRouter: any;
  ...

  beforeEach(async(() => {
    // create your own mock 
    mockRouter = jasmine.createSpyObj('Router', ['navigate']);

    ...

    TestBed.configureTestingModule({
      declarations: [LoginComponent],
      providers: [
        // provide it by value
        { provide: Router, useValue: mockRouter },
        ...
      ],
    }).compileComponents();
  }));

  ...

}); 
Run Code Online (Sandbox Code Playgroud)

这使用了测试床的依赖注入,而不是试图" new测试"被测试的类.

有关上下文中的示例,请参阅我在GitHub上的一个项目.