Karma Jasmine - 为什么即使没有测试用例,我的测试用例也会随机失败?
Karma Jasmin- Why my test cases are failing randomly even if there are no test cases?
这是我的 oninit class,我不应该更改它。
ngOnInit(): void {
this.setCustomizedValues();
this.sub = PubSub.subscribe('highlightEntity', (subId, entityIdentifier: string) => {
document.querySelector(entityIdentifier).classList.add('highlight');
setTimeout(() => {
document.querySelector(entityIdentifier).classList.remove('highlight');
}, 2000);
});
}
这是最小的测试设置
describe('aComponent', () => {
let httpCallerServiceStub = jasmine.createSpyObj('httpCallerServiceStub', ['get']);
let fixture: ComponentFixture<aComponent>;
let componentInstance: aComponent;
localStorage.clear();
beforeEach(() => {
TestBed.configureTestingModule({
declarations: [aComponent],
providers: [
{
provide: HttpCallerService,
useValue: httpCallerServiceStub
}],
imports: [CommonModule, CmcSpinnerModule, NgbModule],
}).compileComponents();
fixture = TestBed.createComponent(aComponent);
componentInstance = fixture.componentRef.instance;
fixture.autoDetectChanges();
});
describe('ngOnInit method', () => {
beforeEach(() => {
fixture.componentInstance.customized = {};
});
it('should initialize with minimum input', () => {
// Triggers ngOnInit
fixture.detectChanges();
expect(fixture.componentInstance.customized).toEqual({});
});
});
问题是测试随机失败,错误是 classlist not found of null
"message": "An error was thrown in afterAll\nTypeError: Cannot read property 'classList' of null\n at <Jasmine>\n
at webpack:///components/path/aComponent.ts:35:53
第35行引用了oninit函数中的这一行
setTimeout(() => {
document.querySelector(entityIdentifier).classList.remove('highlight');
}, 2000);
这里的问题很少
我已经尝试将 tick(2000) 和假 asysnc 放在 ngonit 的简单测试中,但它仍然给我相同的随机错误(如 this answer 所建议)
我的测试平台配置是否缺少某些内容?因为即使我注释掉 oninit 测试并在没有 fixture.detectChanges() 的情况下检查一些随机函数,也会发生相同的随机错误。
如果我 运行 使用 fdescibe 进行测试,所有测试每次都会通过。只有当我从 fdescribe 中删除 f 并且 运行 以及其他组件的所有测试时,才会发生此问题。
请指导我,自从过去 4 天以来我一直被困在这里。
根据评论进一步讨论:
我建议使用模拟而不是实际尝试使 aComponent
在其他单元测试中工作。如果它有自己的依赖项,每次你用其他依赖项或初始化代码扩展它时,它都会抛出这样的错误。如果您不打算在其父组件中测试该功能,那么 mock 应该这样做。
与此同时,您将摆脱任何滴答声等等...
@Component({
selector: 'a-component', //make sure the selector is same as in the real component
template: '<p>Mock A Component</p>'
})
class MockAComponent {}
beforeEach(() => {
TestBed.configureTestingModule({
declarations: [
ParentComponent,
MockAComponent ,
],
// ...
});
});
或者一个简单的解决方案是安装 ng-mocks
然后你不需要单独创建它。
beforeEach(() => {
TestBed.configureTestingModule({
declarations: [
ParentComponent,
MockComponent(AComponent),
],
// ...
});
});
这里有更多相关信息:
这是我的 oninit class,我不应该更改它。
ngOnInit(): void {
this.setCustomizedValues();
this.sub = PubSub.subscribe('highlightEntity', (subId, entityIdentifier: string) => {
document.querySelector(entityIdentifier).classList.add('highlight');
setTimeout(() => {
document.querySelector(entityIdentifier).classList.remove('highlight');
}, 2000);
});
}
这是最小的测试设置
describe('aComponent', () => {
let httpCallerServiceStub = jasmine.createSpyObj('httpCallerServiceStub', ['get']);
let fixture: ComponentFixture<aComponent>;
let componentInstance: aComponent;
localStorage.clear();
beforeEach(() => {
TestBed.configureTestingModule({
declarations: [aComponent],
providers: [
{
provide: HttpCallerService,
useValue: httpCallerServiceStub
}],
imports: [CommonModule, CmcSpinnerModule, NgbModule],
}).compileComponents();
fixture = TestBed.createComponent(aComponent);
componentInstance = fixture.componentRef.instance;
fixture.autoDetectChanges();
});
describe('ngOnInit method', () => {
beforeEach(() => {
fixture.componentInstance.customized = {};
});
it('should initialize with minimum input', () => {
// Triggers ngOnInit
fixture.detectChanges();
expect(fixture.componentInstance.customized).toEqual({});
});
});
问题是测试随机失败,错误是 classlist not found of null
"message": "An error was thrown in afterAll\nTypeError: Cannot read property 'classList' of null\n at <Jasmine>\n
at webpack:///components/path/aComponent.ts:35:53
第35行引用了oninit函数中的这一行
setTimeout(() => {
document.querySelector(entityIdentifier).classList.remove('highlight');
}, 2000);
这里的问题很少
我已经尝试将 tick(2000) 和假 asysnc 放在 ngonit 的简单测试中,但它仍然给我相同的随机错误(如 this answer 所建议)
我的测试平台配置是否缺少某些内容?因为即使我注释掉 oninit 测试并在没有 fixture.detectChanges() 的情况下检查一些随机函数,也会发生相同的随机错误。
如果我 运行 使用 fdescibe 进行测试,所有测试每次都会通过。只有当我从 fdescribe 中删除 f 并且 运行 以及其他组件的所有测试时,才会发生此问题。
请指导我,自从过去 4 天以来我一直被困在这里。
根据评论进一步讨论:
我建议使用模拟而不是实际尝试使 aComponent
在其他单元测试中工作。如果它有自己的依赖项,每次你用其他依赖项或初始化代码扩展它时,它都会抛出这样的错误。如果您不打算在其父组件中测试该功能,那么 mock 应该这样做。
与此同时,您将摆脱任何滴答声等等...
@Component({
selector: 'a-component', //make sure the selector is same as in the real component
template: '<p>Mock A Component</p>'
})
class MockAComponent {}
beforeEach(() => {
TestBed.configureTestingModule({
declarations: [
ParentComponent,
MockAComponent ,
],
// ...
});
});
或者一个简单的解决方案是安装 ng-mocks
然后你不需要单独创建它。
beforeEach(() => {
TestBed.configureTestingModule({
declarations: [
ParentComponent,
MockComponent(AComponent),
],
// ...
});
});
这里有更多相关信息: