angular - Angular Jasmine 测试超时
问题描述
我正在研究一个 Ionic Angular 项目,并且由于超时而不断为各种不同的测试进行间歇性失败的单元测试。奇怪的是,这些只是创建规范文件时默认的“应该创建”测试。
Error: Timeout - Async function did not complete within 5000ms (set by jasmine.DEFAULT_TIMEOUT_INTERVAL)
我已经阅读了一些相关的文章/堆栈溢出帖子,但似乎没有一个可以解决这个问题。很难隔离问题,因为有时它运行良好,而另一些则超时。这发生在几个不同的测试中,但我将提供一个最基本的失败测试的示例。
零件
export class MenuItemCardComponent implements OnInit {
@Input() menuItem: MenuItem
constructor(private firebaseService: FirebaseService) { }
ngOnInit() {
this.loadImage()
}
loadImage() {
this.firebaseService.loadImage(this.menuItem.id, "menuItems").then(url => {
this.menuItem.imageUrl = url
})
}
}
服务功能(this.storage var is firebase.storage.Storage)
async loadImage(id: string, ref: string) {
return this.storage.ref(ref).child(`${id}`).getDownloadURL().catch(() => { /* console.log(`Error getting menuItem id: ${error.code}`) */ })
}
规格文件
describe('MenuItemCardComponent', () => {
let component: MenuItemCardComponent;
let fixture: ComponentFixture<MenuItemCardComponent>;
beforeEach(async(() => {
TestBed.configureTestingModule({
declarations: [ MenuItemCardComponent ],
imports: [IonicModule.forRoot()]
}).compileComponents();
fixture = TestBed.createComponent(MenuItemCardComponent);
component = fixture.componentInstance;
component.menuItem = {
title: "Menu Item",
price: "3.50"
}
fixture.detectChanges();
}));
it('should create', () => {
expect(component).toBeTruthy();
});
});
解决方案
jfd348 是绝对正确的。似乎它确实超时的时间,loadImage
方法调用花费的时间超过 5 秒。要修复它,您必须提供一个存根。
尝试这个:
describe('MenuItemCardComponent', () => {
let component: MenuItemCardComponent;
let fixture: ComponentFixture<MenuItemCardComponent>;
// add this line
let mockFirebaseService: jasmine.SpyObj<FirebaseService>;
beforeEach(async(() => {
// and this one
// The first string is optional but I provide it for debugging purposes
// and the second array strings are the public methods you would like to mock
mockFirebaseService = jasmine.createSpyObj<FirebaseService>('FirebaseService', ['loadImage']);
TestBed.configureTestingModule({
declarations: [ MenuItemCardComponent ],
imports: [IonicModule.forRoot()],
providers: [
// provide the mock for the real FirebaseService
{ provide: FirebaseService, useValue: mockFirebaseService }
]
}).compileComponents();
fixture = TestBed.createComponent(MenuItemCardComponent);
component = fixture.componentInstance;
component.menuItem = {
title: "Menu Item",
price: "3.50"
}
// the first fixture.detectChanges calls ngOnInit so we have to provide
// the results of loadImage before it
mockFirebaseService.loadImage.and.returnValue(Promise.resolve('xyz'));
fixture.detectChanges();
}));
it('should create', () => {
expect(component).toBeTruthy();
});
});
通过这些更改,测试不应该有async
超时。
推荐阅读
- bash - 如何替换文本文件中周期性出现的数组
- python - 创建包含给定值和日期范围的所有可能性的字典的最佳方法是什么?
- console - 自几周前 Google 更新以来,是否有人在他们的操作中也遇到过故障?
- go - 使用切片的动态结构(包含外键)和 go-gorm 将数据插入数据库
- xslt - 如何使用 XSLT 将所有标题文本转换为标题大小写?
- javascript - 如何在 React 的 return 语句中使用获取结果?
- tensorflow - 我想在我的自定义层中使用 keras 层,但我无法将层的输出作为张量而不是对象返回
- javascript - 使用 bootstrap-vue 中的传单删除标记单击时弹出的默认对话框
- asp.net-mvc - 有没有办法在 Visual Studio 2019 for Mac 的上下文中获取 ViewBag、Layout 和 Model?
- c# - CryptoStream.Read 的数组边界错误