Jasmine 单元测试用例中的模拟窗口对象
2020-12-21
4847
我正在尝试编写一个测试用例,但我被卡住了,因为我无法在 jasmine 中的单元测试用例中复制窗口。
我有一个如下的类
public init(): void {
this.Icon['text'] = window['SWIPE']['src'];
this.Icon['altTag'] = window['SWIPE']['alt'];
}
我试图在 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;
}
}
我编写的相同测试用例如下
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 中尝试和模拟的窗口值,如下所示
beforeEach(() => {
fixture = TestBed.createComponent(ConComponent);
component = fixture.componentInstance;
let window = {
'SWIPE': { 'src': 'image', alt: 'image' }
};
fixture.detectChanges();
});
当我运行测试用例时,我仍然收到错误“ TypeError: 无法读取未定义的属性‘src’ ”,我应该去哪里错误任何指导都会有所帮助,因为我仍在学习在 Jasmine 中编写测试用例
2个回答
一种可能的选择是存根
window
对象以进行测试
// backup / restore the property.
const backup = window.SWIPE;
beforeEach(() => backup = window.SWIPE);
afterEach(() => window.SWIPE = backup);
// now the test
beforeEach(() => {
// no let of const
window = {
'SWIPE': { 'src': 'image', alt: 'image' }
};
fixture = TestBed.createComponent(ConComponent);
component = fixture.componentInstance;
fixture.detectChanges();
});
PS。正确的方法是重构应用程序以提供
window
作为令牌。然后您可以通过
providers
伪造它。
satanTime
2020-12-22
如果您使用的是 ChromeHeadless - 您需要模拟浏览器历史记录状态以通过以下方式覆盖 URL 的查询:
beforeEach(() => {
const search = `name=value&name2=value2`;
window.history.pushState({}, 'Test', `/dummy-link.com?${search}`);
});
希望这会有所帮助。
sgryt
2022-06-01