如何在Angular的"toHaveBeenCalledWith"中匹配部分URL

3

我正在使用 toHaveBeenCalledWith 对 URL 进行测试,并且参数应该是不包含 null/ 的部分。

expect(router.navigate).toHaveBeenCalledWith(jasmine.objectContaining(['/home'])); 

我尝试了上述的命令后,出现了以下错误:

Expected spy navigate to have been called with [ <jasmine.objectContaining([ '/home' ])> ] but actual calls were [ [ 'null/home' ] ].
1个回答

2
您需要使用RouterTestingModule来设置测试,但这将要求您测试导航结果而不是检查使用的导航参数。
相反,您可以像这样做:
class RouterMock {
  navigate = jasmine.createSpy('navigate')
}

TestBed.configureTestingModule({
  providers: [
    {
      provide: Router,
      useClass: RouterMock 
    },
    ...
  ]
});

你可以像这样检查间谍最后调用的参数:
it('should...', inject([Router], (router: RouterMock) => {
  // ... setup test
  expect(router.navigate.calls.mostRecent().args).toEqual(jasmine.objectContaining(['/home'])); 
}))

Stackblitz示例


我无法使用mostRecentCall。 - suchip
为什么它应该是间谍,你是如何窥视那个方法的? 或者你没有使用正确的类型来监视那个被监视的路由器。 - Xesenix
我正在使用 spyOn(router, 'navigate');如果我使用 expect(router.navigate).toHaveBeenCalledWith(['null/home']),它能正常工作。 - suchip
它显示了错误: 在“(commands: any[], extras?: NavigationExtras) => Promise<boolean>”类型上不存在属性“mostRecentCall”。 - suchip
抱歉,我很久没有用它了。修好了,这里是一个工作的例子:https://stackblitz.com/edit/angular-testing-ipxa1c - Xesenix
显示剩余7条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接