Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/oop/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Angular Jasmine单元测试用例中的模拟窗口对象_Angular_Unit Testing_Jasmine_Tdd_Karma Jasmine - Fatal编程技术网

Angular Jasmine单元测试用例中的模拟窗口对象

Angular Jasmine单元测试用例中的模拟窗口对象,angular,unit-testing,jasmine,tdd,karma-jasmine,Angular,Unit Testing,Jasmine,Tdd,Karma Jasmine,我正试图编写一个测试用例,但我被卡住了,因为我无法在jasmine中复制单元测试用例中的窗口 我有如下的课程 public init(): void { this.Icon['text'] = window['SWIPE']['src']; this.Icon['altTag'] = window['SWIPE']['alt']; } it('should set isReady as true on onNavigation value in switch', asyn

我正试图编写一个测试用例,但我被卡住了,因为我无法在jasmine中复制单元测试用例中的窗口

我有如下的课程

 public init(): void {
    this.Icon['text'] = window['SWIPE']['src'];
    this.Icon['altTag'] = window['SWIPE']['alt'];
  }
it('should set isReady as true on onNavigation value in switch', async(() => {
    component.ngOnInit();
    fixture.detectChanges();

    fixture.whenStable().then(() => {
      component.onMessageReceived({ event: 'onNavigation', data: {} });
      expect(component.isReady).toBeTrue();
    });
  }));
我试图在spec.ts文件中模拟上面的窗口对象,如下所示

 let window = {
      'SWIPE': { 'src': 'image', alt: 'image' }
    };
init类是根据条件从另一个类扩展而来的,如下所示

 public onMessageReceived(event: object) {
        switch (event && event['event']) {
          case 'onNavigation':
            this.init();
            this.isReady = true; 
            break;
    }
    }
我已经编写了相同的测试用例,如下所示

 public init(): void {
    this.Icon['text'] = window['SWIPE']['src'];
    this.Icon['altTag'] = window['SWIPE']['alt'];
  }
it('should set isReady as true on onNavigation value in switch', async(() => {
    component.ngOnInit();
    fixture.detectChanges();

    fixture.whenStable().then(() => {
      component.onMessageReceived({ event: 'onNavigation', data: {} });
      expect(component.isReady).toBeTrue();
    });
  }));
以及我之前尝试和模仿的窗口的价值,如下所示

beforeEach(() => {
    fixture = TestBed.createComponent(ConComponent);
    component = fixture.componentInstance;


    let window = {
      'SWIPE': { 'src': 'image', alt: 'image' }
    };


    fixture.detectChanges();
  });

但是,当我运行测试用例时,我得到一个错误“TypeError:Cannotread属性'src'of undefined”哪里会出错?任何指导都会有帮助,因为我仍在学习用jasmine编写测试用例一个可能的选项是为测试存根
窗口
对象

//备份/还原属性。
const backup=window.SWIPE;
每次之前(()=>backup=window.swip);
每次之后(()=>window.swip=backup);
//现在是测试
在每个之前(()=>{
//不让康斯特
窗口={
'SWIPE':{'src':'image',alt:'image'}
};
fixture=TestBed.createComponent(ConComponent);
组件=fixture.componentInstance;
fixture.detectChanges();
});

正确的方法是重构应用程序,以提供
window
作为标记。然后,您可以通过
提供程序

伪造它。一个可能的选项是存根
窗口
对象以进行测试

//备份/还原属性。
const backup=window.SWIPE;
每次之前(()=>backup=window.swip);
每次之后(()=>window.swip=backup);
//现在是测试
在每个之前(()=>{
//不让康斯特
窗口={
'SWIPE':{'src':'image',alt:'image'}
};
fixture=TestBed.createComponent(ConComponent);
组件=fixture.componentInstance;
fixture.detectChanges();
});

正确的方法是重构应用程序,以提供
window
作为标记。然后您可以通过
提供者

让window
声明一个名为window的局部变量来伪造它,而引用全局窗口的任何对象都不会看到该变量。一个简单的解决方案是使用一个包装全局窗口的服务,这是一个外观,您的其余代码可以使用它,然后注入一个测试的两倍。您能否为您@jonrsharpe
let window
声明名为window的局部变量的相同请求提供一个示例,这不会被任何引用全局窗口的东西看到。一个简单的解决方案是,使用一个包装全局窗口的服务,一个外观供您的其他代码使用,然后注入一个测试的两倍,用于测试。您能为@jornsharpe提供一个相同请求的示例吗