Angular2,Karma:fail()请求没有失败

时间:2017-03-15 02:45:42

标签: angular typescript jasmine karma-jasmine

我还在编写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()。我有明显错误的代码,但只要我修复了一件错误的错误消息就会消失。无法证明失败几乎使测试套件无效。

感谢您的回答, 杰罗姆。

1 个答案:

答案 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()调用将等待该任务完成,所以现在我们可以将测试视为同步测试

另见: