在angular2中测试router-outlet组件

前端之家收集整理的这篇文章主要介绍了在angular2中测试router-outlet组件前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
我有一个html所在的homecomponent

//home.component.html

  1. <router-outlet></router-outlet>

//home.component.ts

  1. import { Component,OnInit } from '@angular/core';
  2. import { Router } from '@angular/router';
  3.  
  4. import { HomeService} from './shared/services/home.service';
  5.  
  6. @Component({
  7. // moduleId: module.id,selector: 'app-home',templateUrl: 'home.component.html',styleUrls: ['home.component.css'],providers:[HomeService]
  8. })
  9. export class HomeComponent implements OnInit {
  10.  
  11. constructor(private service:HomeService,private route:Router) { }
  12.  
  13. ngOnInit() {
  14. if(this.service.isAuthenticated()){
  15. this.route.navigateByUrl('dashboard/main');
  16. }
  17. }
  18. }

//home.component.spec.ts

  1. import { ComponentFixture,TestBed } from '@angular/core/testing';
  2. import { By } from '@angular/platform-browser';
  3. import { DebugElement } from '@angular/core';
  4. import { async,inject } from '@angular/core/testing';
  5. import { HomeComponent } from './home.component';
  6. import { Router} from '@angular/router';
  7. import { HomeService } from './shared/services/home.service';
  8.  
  9. class RouterStub {
  10. navigateByUrl(url: string) { return url }
  11. }
  12.  
  13. class MockHomeService {
  14. isAuthenticated() {
  15. return true
  16. }
  17. }
  18.  
  19. let comp: HomeComponent;
  20. let fixture: ComponentFixture<HomeComponent>;
  21.  
  22.  
  23. describe('Component: HomeComponent',() => {
  24.  
  25.  
  26. beforeEach(() => {
  27. TestBed.configureTestingModule({
  28.  
  29. declarations: [HomeComponent],providers: [
  30. { provide: Router,useClass: RouterStub },{ provide: HomeService,useClass: MockHomeService },]
  31. });
  32.  
  33. fixture = TestBed.createComponent(HomeComponent);
  34. comp = fixture.componentInstance;
  35.  
  36. });
  37.  
  38. it('should tell ROUTER to navigate to dashboard/main if authencated',inject([Router,HomeService],(router: Router,homeservice: HomeService) => {
  39. const spy = spyOn(router,'navigateByUrl');
  40. comp.ngOnInit();
  41. if (homeservice.isAuthenticated()) {
  42. const navArgs = spy.calls.first().args[0];
  43. expect(navArgs).toBe('dashboard/main');
  44. }
  45.  
  46.  
  47. }));
  48. });

我收到以下错误

  1. Error: Template parse errors:
  2. 'router-outlet' is not a known element:
  3. 1. If 'router-outlet' is an Angular component,then verify that it is pa
  4. rt of this module.
  5. 2. If 'router-outlet' is a Web Component then add "CUSTOM_ELEMENTS_SCHEM
  6. A" to the '@NgModule.schema' of this component to suppress this message. ("<div
  7. class="">
  8. [ERROR ->]<router-outlet></router-outlet>
  9. </div>
  10. "): HomeComponent@1:4
  11. at TemplateParser.parse (http://localhost:9876/_karma_webpack_/0.bun
  12. dle.js:21444:19)
  13. at RuntimeCompiler._compileTemplate (http://localhost:9876/_karma_we
  14. bpack_/0.bundle.js:6569:51)
  15. at http://localhost:9876/_karma_webpack_/0.bundle.js:6492:83
  16. at Set.forEach (native)
  17. at compile (http://localhost:9876/_karma_webpack_/0.bundle.js:6492:4
  18. 7)
  19. at RuntimeCompiler._compileComponents (http://localhost:9876/_karma_
  20. webpack_/0.bundle.js:6494:13)
  21. at RuntimeCompiler._compileModuleAndAllComponents (http://localhost:
  22. 9876/_karma_webpack_/0.bundle.js:6411:37)
  23. at RuntimeCompiler.compileModuleAndAllComponentsSync (http://localho
  24. st:9876/_karma_webpack_/0.bundle.js:6399:21)
  25. at TestingCompilerImpl.compileModuleAndAllComponentsSync (http://loc
  26. alhost:9876/_karma_webpack_/0.bundle.js:10203:35)
  27. at TestBed._initIfNeeded (webpack:///D:/myapp/transfer(9)/transfer/~
  28. /@angular/core/bundles/core-testing.umd.js:1059:0 <- src/test.ts:4943:40)

我在做什么错?

提前致谢

错误是因为< router-outlet>在部分RouterModule1中,未导入到您的测试台配置中.

如果你不关心测试任何实际的实际路由(我注意到模拟路由器),那么你可以让Angular忽略< router-outlet>通过在测试床配置中添加以下元素.

  1. import { CUSTOM_ELEMENTS_SCHEMA } from '@angular/core';
  2.  
  3. TestBed.configureTestingModule({
  4. schemas: [ CUSTOM_ELEMENTS_SCHEMA ]
  5. });

只是一个建议.您希望测试组件上的行为,并且行为是在创建组件并对用户进行身份验证时,应该调用路由器导航方法.所以我们应该测试一下调用导航方法.我们怎么做?使用Spies.您可以通过navigateByUrl方法创建一个间谍,然后您可以使用jasmine检查该方法是否被调用

  1. import { getTestBed } from '@angular/core/testing';
  2.  
  3. class RouterStub {
  4. navigateByUrl = jasmine.createSpy('navigateByUrl');
  5. }
  6.  
  7. it('should navigate',() => {
  8. fixture.detectChanges();
  9. let router: Router = getTestBed().get(Router);
  10. expect(router.navigateByUrl).toHaveBeenCalledWith('dashboard/main');
  11. });

UPDATE

现在你得到一个缺少的Http提供程序错误.

因为@Component上有提供者:[HomeService],它会覆盖测试模块配置中的提供者(即模拟).在这种情况下,您应该覆盖组件提供程序

  1. TestBed.configureTestingModule({});
  2. TestBed.overrideComponent(HomeComponent,{
  3. set: {
  4. providers: [
  5. { provide: HomeService,useClass: MockHomeService }
  6. ]
  7. }
  8. })

1 – 对于测试,它实际上应该是RouterTestingModule,如here所述

猜你在找的Angularjs相关文章