如何防止 window.open(url, '_blank') 在 jasmine 单元测试期间实际打开

问题描述 投票:0回答:2

当我尝试测试

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');
    });
}
unit-testing jasmine
2个回答
2
投票

您的代码的问题是使用了 callThrough 方法,该方法负责打开 URL。只需将其删除即可解决您的问题。

只需使用以下行:

 windowSpy = spyOn(window, 'open');

使用callthrough


0
投票

您可以通过添加来提供窗口对象作为可注入令牌

{ provide: Window, useValue: window }

NgModule
中的providers数组,然后将window对象像服务一样注入到构造函数中。需要更多的工作,但您可以在测试中提供模拟,以便完全控制
.open()
的行为。

为了解决这个问题,@Jasdeep Singh 的答案肯定更好,但这是一个方便的小技巧,可以知道你是否在测试中做了更多的事情。

© www.soinside.com 2019 - 2024. All rights reserved.