0

出于某种原因,这两个规范正在通过,但是第二个规范正在模板内测试插值,使用来自服务的异步数据。为什么不需要用异步包装回调函数?

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'});
  }
};
4

2 回答 2

0

如果期望函数是异步的,则必须使用 Angular 助手async将回调函数包装在测试块中。fakeAsync

getSomeServiceMock使用Observable.of并且是同步的。这就是为什么async是可选的。

如果该测试套件中涉及的组件不包含异步加载的组件,那么asyncinbeforeEach也是可选的。

根据经验,所有测试块都可以用fakeAsync. 它比它更快async并且会让你知道它是否不合适(当真正的异步操作发生在一个块中时)。

于 2018-02-06T18:41:20.950 回答
0

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

于 2018-02-06T19:04:50.190 回答