angular - 带有 routerLink 指令的单元测试按钮

标签 angular

我有一个简单的静态 View ,我想为其编写测试:

<div class="landing-page">
 <app-cover>
   <app-stack [large]="true">
     <app-center> 
       <img src="assets/images/logo.svg" />
     </app-center>
     <app-center>
       <p>
         Try matching the employee to their photo.
       </p>
     </app-center>
     <app-center>
       <app-button routerLink="namegame">
         Play!
       </app-button>
     </app-center>
   </app-stack>
 </app-cover>
</div>

我能够断言 <p> 的文本标签和 <button>很容易准确。但是,我在为按钮行为编写单元测试时遇到问题,例如当我点击按钮时,我被导航到 /namegame路线。

我从 Karma 看到的消息真的很困惑:

Chrome 83.0.4103.106 (Mac OS 10.15.5) NamegameComponent navigates to /namegame when the "Play" 

button is clicked FAILED
Expected spy navigateByUrl to have been called with:
 [ '/namegame', <jasmine.anything> ]
but actual calls were:
 [ /namegame, Object({ skipLocationChange: false, replaceUrl: false, state: undefined }) ].
Call 0:
 Expected $[0] = /namegame to equal '/namegame'.

测试代码:

// ... imports ...

describe('NamegameComponent', () => {
 let component: LandingPageComponent;
 let fixture: ComponentFixture<LandingPageComponent>;
 let router: Router;

 beforeEach(async(() => {
   TestBed.configureTestingModule({
     imports: [RouterTestingModule.withRoutes([])],
     declarations: [
       LandingPageComponent,
       CenterComponent,
       CoverComponent,
       StackComponent,
       ButtonComponent,
     ],
   }).compileComponents();
 }));

 beforeEach(() => {
   fixture = TestBed.createComponent(LandingPageComponent);
   component = fixture.componentInstance;
   router = TestBed.inject(Router);
   fixture.detectChanges();
 });

 // ... other tests ...

 it('navigates to /namegame when the "Play" button is clicked', () => {
   const navSpy = spyOn(router, 'navigateByUrl');
   const button = fixture.nativeElement.querySelector('app-button');
   button.click();
   expect(navSpy).toHaveBeenCalledTimes(1);
   expect(navSpy).toHaveBeenCalledWith(`/namegame`, jasmine.anything());
 });
});

断言不匹配的任何想法?引用有问题吗?

最佳答案

问题原来是navigateByUrlUrlTree 调用不是我最初预期的字符串。

这些断言中的任何一个都有效:

// matching the UrlTree directly
expect(navSpy).toHaveBeenCalledWith(
  router.createUrlTree(['/namegame']), 
  jasmine.anything()
);

// explicitly convert the UrlTree to a string before comparison
expect(navSpy.calls.mostRecent().args[0].toString()).toEqual('/namegame');

关于angular - 带有 routerLink 指令的单元测试按钮,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/62436030/

相关文章:

node.js - NPM 注册表错误 503

angular - 为什么 Angular2 不能注入(inject)我的服务?

javascript - 如何更新 Angular2 中的矩阵参数

angular - 创建没有内联样式的 Angular 2 组件库

angular - 无法捕获自定义事件

angular - 如何将数字转换为 Angular 2组件:内的字符串

angular - 结合使用 @ViewChildren/@ContentChildren 和 router-outlet

angular - Mat-tab 点击事件

node.js - Angular2 TypeScript - 错误 TS2307 : Cannot find module 'angular2/forms'

Angular2 注入(inject)的自定义服务未定义