异步之前每个在每个测试单元之前/之后完成

时间:2018-10-17 22:29:38

标签: angular jasmine karma-jasmine angular-test testbed

嘿,我是6号角(也称为角)测试的新手,我担心要升级到目前为止所见过的每项测试。

首先让我们看一下由cli生成的简单组件的简单测试

describe('CompComponent', () => {
  let component: CompComponent;
  let fixture: ComponentFixture<CompComponent>;

  beforeEach(async(() => {
    TestBed.configureTestingModule({
      declarations: [ CompComponent ]
    })
    .compileComponents();
  }));

  beforeEach(() => {
    fixture = TestBed.createComponent(CompComponent);
    component = fixture.componentInstance;
    fixture.detectChanges();
  });

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

我有一个主要问题:

1。我如何确定每个Async beforeEach调用都在每个测试单元(也称为测试单元)之前完成?在任何情况下,每次调用之后都会发生此调用,因为它毕竟是异步调用吗?

1 个答案:

答案 0 :(得分:1)

每个beforeEach将在任何测试开始之前完成。

在您的示例中,compileComponents()是异步的。因此,在这种情况下,我们必须使用async()方法。

供参考,请查看以下链接:https://github.com/angular/angular-cli/issues/4774

为确保您的beforeEach将在任何测试开始之前完成,您可以尝试通过添加以下内容来调试测试:

compileComponents().then( result => {
  console.log(result);
}

您可以在以下行中设置断点:console.log(result);,您会看到它会在每次运行测试时都执行,因此如果您在此console.log' line and another one in your firt中设置断点{{ 1}} console.log`的断点一,这意味着我们必须等待beforeEach内部的任何异步调用,然后才能进行任何测试。

查看test, you will see you will never get to the second break point before doing the将在所有测试开始之前一直完成的另一种方法是也以这种方式编写测试:

beforeEach

您将看到在任何测试中beforeEach(async(() => { TestBed.configureTestingModule({ declarations: [ CompComponent ] }).compileComponents().then( result => { fixture = TestBed.createComponent(CompComponent); component = fixture.componentInstance; } })); 都已经可用,这样做。因此,您无需在beforeEach之前添加另一个即可初始化fixture

要了解更多信息,可以参考Stack Overflow的其他答案:

angular-2-testing-async-function-call-when-to-use