什么时候必须用Async包装规范的回调函数?

时间:2018-02-06 18:06:35

标签: javascript angular angular-services angular-test angular-unit-test

由于某些原因,这两个规格正在通过,但第二个规范是在模板中测试插值,使用来自服务的异步数据。为什么没有必要用async包装回调函数?

describe('SaangComponent', () => {
  let component: SaangComponent;
  let fixture: ComponentFixture<SaangComponent>;
  let compiled: HTMLElement;
  beforeEach(async(() => {
    TestBed.configureTestingModule({
      declarations: [ SaangComponent ],
      providers: [
        {provide: GetSomeService, useValue: getSomeServiceMock}
      ]
    })
    .compileComponents();
  }));

  beforeEach(() => {
    fixture = TestBed.createComponent(SaangComponent);
    component = fixture.componentInstance;
    compiled = fixture.debugElement.query(By.css('h1')).nativeElement;
    fixture.detectChanges();
  });

  it('should create', () => {
    expect(component).toBeTruthy();
  });

  it('should update the h1 attribute with the title', () => {

    fixture.detectChanges();
    const expectedText = compiled.innerHTML;
    expect(expectedText).toEqual('lord');
  });
});

const getSomeServiceMock = {
  getSomeData() {
    return Observable.of({title: 'lord'});
  }
};

2 个答案:

答案 0 :(得分:0)

如果函数预期是异步的,则必须使用asyncfakeAsync Angular helper将测试块中的回调函数包装起来。

getSomeServiceMock使用Observable.of并且同步。这就是async是可选的原因。

如果此测试套件中涉及的组件不包含异步加载的组件,async中的beforeEach也是可选的。

根据经验,所有测试块都可以用fakeAsync包裹。它比async快,并且会告诉您它是否不合适(当块中发生真正的异步操作时)。

答案 1 :(得分:0)

我假设在组件的ngOnInit生命周期钩子中调用'getSomeData'。如果是这样,您在创建组件时已经使用了您正在使用的模拟响应。