我还在编写Angular.io Heroes教程版本的测试。在为组件编写测试时,我遇到了一些特殊的问题。我不能让这个测试失败。
例如:
describe('OrgDetailComponent', () => {
let comp: OrgDetailComponent;
let fixture: ComponentFixture<OrgDetailComponent>;
let de: DebugElement;
let el: HTMLElement;
let org1: Org = new Org({ ... fills Org ... });
let dialogService: DialogService = null;
let globalsService: GlobalsService = null;
let orgService: OrgService = null;
let routeStub: any = { data: Observable.of( { org: org1 } ) } ;
beforeEach(async(() => {
TestBed.configureTestingModule({
imports: [ FormsModule, RouterTestingModule ],
providers : [
{ provide: DialogService, useClass: MockDialogService },
{ provide: GlobalsService, useClass: MockGlobalsService },
{ provide: OrgService, useClass: MockOrgService },
{ provide: ActivatedRoute, useValue: routeStub }
],
declarations: [ OrgDetailComponent ],
})
.compileComponents();
}));
beforeEach(() => {
fixture = TestBed.createComponent(OrgDetailComponent);
dialogService = fixture.debugElement.injector.get(DialogService);
globalsService = fixture.debugElement.injector.get(GlobalsService);
orgService = fixture.debugElement.injector.get(OrgService);
});
it('should always fail', () => {
fixture.detectChanges();
fixture.whenStable().then(() => {
fail('forced fail');
});
});
});
运行此测试并且未报告任何故障。在try-catch中包装失败。调试器将在fail()处暂停。但是你没有进入catch()。业力总是报告成功。 Whyso?
这与我有关,因为我无法证明我的测试有效。我正在编写多个涉及这些fixture的克隆的测试.whenStable()。我有明显错误的代码,但只要我修复了一件错误的错误消息就会消失。无法证明失败几乎使测试套件无效。
感谢您的回答, 杰罗姆。
答案 0 :(得分:0)
tparm()
异步解析,因此您需要使用fixture.whenStable()
async
包装在import { async } from '@angular/core/testing'
it('should always fail', async(() => {
fixture.detectChanges();
fixture.whenStable().then(() => {
fail('forced fail');
});
}));
中,Angular将等待所有异步任务完成,然后才能完成测试。如果没有async
,则测试在异步async
结算之前完成。
就像你的whenStable()
一样。对beforeEach(async(()
的调用异步解析,因此您将其包装在compileComponents
中以等待它完成。
另一种选择是使用async
组合,我们可以使用它来进行测试&#34;似乎&#34;通过调用fakeAsync/tick
tick
假设import { fakeAsync, tick } from '@angular/core/testing'
it('should always fail', fakeAsync(() => {
fixture.detectChanges();
tick()
expect(...)
}));
导致执行某些异步任务,fixture.detectChanges()
调用将等待该任务完成,所以现在我们可以将测试视为同步测试
另见: