当我尝试测试
window.open(url, '_blank')
时,它会在测试过程中自动在我的浏览器中打开一个新选项卡。有什么办法可以防止这种情况发生吗?
就像,尝试打开一个新选项卡,但不要这样做。我知道您可以做到
jasmine.createSpyObj('obj', ['methods']).and.returnValue({...})
,但我不知道如何做到这一点 window.open
。
导航服务
export class NavigationService {
navigate(url: string, openInNewTab: boolean = false): boolean {
if (url.startsWith('http')) {
openInNewTab ? window.open(url, '_blank') : ((window as any).location.href = url);
return false;
}
...
}
}
导航服务规范
describe('NavigationService', () => {
let navigationService: NavigationService;
let routerSpy, configServiceSpy, windowSpy;
let httpUrlMock = 'http://mock.com';
beforeEach(() => {
routerSpy = jasmine.createSpyObj('Router', ['createUrlTree', 'navigateByUrl']);
configServiceSpy = jasmine.createSpyObj('ConfigService', ['current']);
windowSpy = spyOn(window, 'open').and.callThrough();
navigationService = new NavigationService(routerSpy, configServiceSpy);
});
it('should open the url in a new tab when the url starts with http ', () => {
let _result = navigationService.navigate(httpUrlMock, true);
expect(windowSpy).toHaveBeenCalledWith(httpUrlMock, '_blank');
});
}
您的代码的问题是使用了 callThrough 方法,该方法负责打开 URL。只需将其删除即可解决您的问题。
只需使用以下行:
windowSpy = spyOn(window, 'open');
您可以通过添加来提供窗口对象作为可注入令牌
{ provide: Window, useValue: window }
到
NgModule
中的providers数组,然后将window对象像服务一样注入到构造函数中。需要更多的工作,但您可以在测试中提供模拟,以便完全控制 .open()
的行为。
为了解决这个问题,@Jasdeep Singh 的答案肯定更好,但这是一个方便的小技巧,可以知道你是否在测试中做了更多的事情。