Angular 2 Testing - 异步函数调用 - 何时使用

时间:2016-10-19 09:01:16

标签: angular unit-testing karma-jasmine angular2-testing angular-test

在Angular 2中进行测试时,何时在 TestBed 中使用async函数?

你什么时候使用它?

 beforeEach(() => {
        TestBed.configureTestingModule({
            declarations: [MyModule],
            schemas: [NO_ERRORS_SCHEMA],
        });
    });

你何时使用它?

beforeEach(async(() => {
    TestBed.configureTestingModule({
        declarations: [MyModule],
        schemas: [NO_ERRORS_SCHEMA],
    });
}));

有谁可以启发我这个?

2 个答案:

答案 0 :(得分:71)

async完成所有任务之前,

async将不允许下一个测试开始。 async所做的是将回调包装在区域中,其中跟踪所有异步任务(例如setTimeout)。完成所有异步任务后,async完成。

如果您曾在Angular外面使用过Jasmine,那么您可能已经看到done被传递给回调

it('..', function(done) {
  someAsyncAction().then(() => {
    expect(something).toBe(something);
    done();
  });
});

在这里,这是原生的Jasmine,我们告诉Jasmine这个测试应该延迟完成,直到我们调用done()。如果我们没有拨打done()而是这样做:

it('..', function() {
  someAsyncAction().then(() => {
    expect(something).toBe(something);
  });
});

测试将在期望之前完成,因为在测试完成执行同步任务之后,promise将解析

使用Angular(在Jasmine环境中),当我们使用done时,Angular实际上会在幕后调用async。它将跟踪区域中的所有异步任务,当它们全部完成后,将在后台调用done

在具有TestBed配置的特定情况下,您通常会在compileComponents时使用此配置。我很少遇到一种我不得不称之为

的情况
beforeEach(async(() => {
   TestBed.configureTestingModule({
     declarations: [MyModule],
     schemas: [NO_ERRORS_SCHEMA],
   })
   .compileComponent().then(() => {
      fixture = TestBed.createComponent(TestComponent);
   });
}));

在测试使用templateUrl的组件时(如果您不使用webpack),则Angular需要发出XHR请求来获取模板,因此组件的编译将是异步的。所以我们应该等到它结算后再继续测试。

答案 1 :(得分:19)

当您在测试中进行异步调用时,实际的测试功能在异步调用完成之前完成。 当您需要在调用完成时验证某些状态(通常就是这种情况),那么测试框架会在仍有异步工作的情况下将测试报告为已完成。

使用DataColumn,告诉测试框架等到返回promise或observable完成后再将测试视为已完成。

DataTable

传递给async(...)的代码将在测试函数本身完成后执行。 使用it('should show quote after getQuote promise (async)', async(() => { fixture.detectChanges(); fixture.whenStable().then(() => { // wait for async getQuote fixture.detectChanges(); // update view with quote expect(el.textContent).toBe(testQuote); }); })); ,您可以使测试框架知道,在将测试视为已完成之前,需要等待promises和observable完成。

另见