Angular Jasmine单元测试用例中的模拟窗口对象
我正试图编写一个测试用例,但我被卡住了,因为我无法在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
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的局部变量来伪造它,而引用全局窗口的任何对象都不会看到该变量。一个简单的解决方案是使用一个包装全局窗口的服务,这是一个外观,您的其余代码可以使用它,然后注入一个测试的两倍。您能否为您@jonrsharpelet window
声明名为window的局部变量的相同请求提供一个示例,这不会被任何引用全局窗口的东西看到。一个简单的解决方案是,使用一个包装全局窗口的服务,一个外观供您的其他代码使用,然后注入一个测试的两倍,用于测试。您能为@jornsharpe提供一个相同请求的示例吗