加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 综合聚焦 > 服务器 > 安全 > 正文

unit-testing – 如何在Angular2中对调用window.location.href的

发布时间:2020-12-17 07:00:41 所属栏目:安全 来源:网络整理
导读:我有这个功能我需要测试: login(): void { this.userService.setSessionAndDateOnlogin(); this.loginService.getLogin() .subscribe( octopusUrl = window.location.href = octopusUrl); } 我使用window.location.href导航到外部URL. 这是我的测试: it('l
我有这个功能我需要测试:

login(): void {
    this.userService.setSessionAndDateOnlogin();
    this.loginService.getLogin()
      .subscribe(
        octopusUrl => window.location.href = octopusUrl);
  }

我使用window.location.href导航到外部URL.

这是我的测试:

it('login function should call the setSessionAndDateOnLogin function from the userservice and
   subscribe to the  getLogin function of the loginService.',fakeAsync(
      inject(
        [LoginComponent,LoginService,UserService],(loginComponent: LoginComponent,loginService: LoginService,userService: UserService) => {
          spyOn(userService,'setSessionAndDateOnlogin');
          loginComponent.login();
          expect(userService.setSessionAndDateOnlogin).toHaveBeenCalled();
        })
    )
  );

当我运行此测试时,我收到以下错误:

Some of your tests did a full page reload!

所以我试着模仿窗口对象:

import { window } from '@angular/platform-browser/src/facade/browser';
...
class MockWindow {
  location: {
    href: ''
  };
}
...
beforeEach(() => addProviders([
    ...
    { provide: window,useClass: MockWindow }
  ]));

这没有改变,错误仍然存??在.

有没有人有这个问题的解决方案?

解决方法

Window是一个无法注入的接口.你应该使用OpaqueToken

import {Injectable,OpaqueToken,Inject} from '@angular/core';

export const WindowToken = new OpaqueToken('Window');
export const SomeServiceWithWindowDependencyToken = new OpaqueToken('SomeServiceWithWindowDependency');

export function _window(): Window {
  return window;
}


export class SomeServiceWithWindowDependency {
  private window: Window;

  constructor(@Inject(WindowToken) window: Window) {
    this.window = window;
  }
}

然后在测试中

describe('SomeServiceWithWindowDependency',() => {
  beforeEach(() => {
    let mockWindow: any = {
      location: {
        hostname: ''
      }
    };
    TestBed.configureTestingModule({
      providers: [
        {provide: WindowToken,useValue: mockWindow},{provide: SomeServiceWithWindowDependencyToken,useClass: SomeServiceWithWindowDependency}
      ]
    });
  });
  it('should do something',inject([SomeServiceWithWindowDependencyToken,WindowToken],(tested: SomeServiceWithWindowDependency,window: Window) => {
    window.location.hostname = 'localhost';
    expect(tested.someMethod()).toBe('result');
  }));
});

并记住配置app模块使用真正的窗口对象

@NgModule({
 declarations: [
    ...
  ],imports: [
    ...
  ],providers: [
    ...
    {provide: WindowToken,useFactory: _window},],bootstrap: [AppComponent]
})
export class AppModule {
}

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读