如何为Angular 2中调用window.open的方法编写单元测试?
如何为Angular控制器中的
goToTermsOfService方法编写单元测试 没问题!针对你这个打开服务条款新窗口的方法,咱们可以通过mock依赖服务的方式来写单元测试——毕竟咱们肯定不想在跑测试的时候真的弹出浏览器窗口对吧?下面是具体步骤和代码示例:
1. 先明确要Mock的依赖
你的方法依赖两个外部服务,测试时必须把它们Mock掉,避免依赖真实实现:
nativeWindow:用来调用open方法translate:用来获取当前语言currentLang
2. 完整测试代码示例
我把代码拆成了可复用的模块,你直接替换成自己的组件路径就行:
import { ComponentFixture, TestBed } from '@angular/core/testing'; import { YourComponent } from './your-component.component'; // 替换成你的组件/控制器路径 import { TranslateService } from '@ngx-translate/core'; // 假设你用的是ngx-translate import { NATIVE_WINDOW } from './your-window-token'; // 假设你用OpaqueToken注入window // 自定义Mock TranslateService,控制测试用的语言 class MockTranslateService { currentLang = 'en'; // 默认测试语言,可按需修改 } describe('YourComponent', () => { let component: YourComponent; let fixture: ComponentFixture<YourComponent>; let mockWindow: any; let mockTranslate: MockTranslateService; beforeEach(async () => { // 创建Mock窗口对象,用Jasmine Spy跟踪open方法调用 mockWindow = { open: jasmine.createSpy('open') }; await TestBed.configureTestingModule({ declarations: [YourComponent], providers: [ // 注入Mock的TranslateService { provide: TranslateService, useClass: MockTranslateService }, // 注入Mock的nativeWindow { provide: NATIVE_WINDOW, useValue: mockWindow } ] }).compileComponents(); }); beforeEach(() => { fixture = TestBed.createComponent(YourComponent); component = fixture.componentInstance; mockTranslate = TestBed.inject(TranslateService) as unknown as MockTranslateService; fixture.detectChanges(); }); it('should open terms window with correct URL and target', () => { // 执行要测试的方法 component.goToTermsOfService(); // 验证window.open是否被正确调用,参数完全匹配 expect(mockWindow.open).toHaveBeenCalledWith( 'someurl/en/Home/License', // 对应Mock的currentLang='en' '_blank' ); }); it('should adapt URL to current language from translate service', () => { // 切换测试语言,验证URL拼接逻辑 mockTranslate.currentLang = 'zh'; component.goToTermsOfService(); expect(mockWindow.open).toHaveBeenCalledWith( 'someurl/zh/Home/License', '_blank' ); }); });
3. 特殊情况处理
如果你的nativeWindow是直接用全局window对象(而非依赖注入),那可以直接Mock全局window:
// 在beforeEach里添加 (window as any).open = jasmine.createSpy('open'); // 测试时直接验证 expect(window.open).toHaveBeenCalledWith(/* 参数 */);
内容的提问来源于stack exchange,提问作者pankaj
相关产品推荐
相关产品推荐

