You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何为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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.28 03:59:10