Angular 2 测试 - 异步函数调用 - 何时使用
Angular 2 Testing - Async function call - when to use
在 Angular 2 中测试时,什么时候使用 TestBed 中的异步函数?
你什么时候用这个?
beforeEach(() => {
TestBed.configureTestingModule({
declarations: [MyModule],
schemas: [NO_ERRORS_SCHEMA],
});
});
你什么时候用这个?
beforeEach(async(() => {
TestBed.configureTestingModule({
declarations: [MyModule],
schemas: [NO_ERRORS_SCHEMA],
});
}));
任何人都可以启发我吗?
当您在测试中进行异步调用时,实际测试功能会在异步调用完成之前完成。
当您需要在调用完成时验证某些状态(通常是这种情况)时,测试框架会报告测试已完成,而异步工作仍在进行中。
使用 async(...)
你告诉测试框架等到 return promise 或 observable 完成后再将测试视为已完成。
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);
});
}));
传递给 then(...)
的代码将在测试函数本身完成后执行。
使用 async()
,您可以让测试框架知道,它需要等待 promises 和 observables 完成,然后才能将测试视为已完成。
另见
在 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);
});
});
测试甚至会在预期之前完成,因为承诺在测试完成同步任务执行后解析。
使用Angular(在Jasmine环境中),Angular实际上会在我们使用async
时在幕后调用done
。它会跟踪 Zone 中所有的异步任务,当它们全部完成时,done
将在幕后调用。
在您使用 TestBed
配置的特定情况下,您通常会在需要 compileComponents
时使用它。我很少 运行 遇到不得不调用它的情况
beforeEach(async(() => {
TestBed.configureTestingModule({
declarations: [MyModule],
schemas: [NO_ERRORS_SCHEMA],
})
.compileComponent().then(() => {
fixture = TestBed.createComponent(TestComponent);
});
}));
当测试使用templateUrl
的组件时(如果你没有使用webpack),那么Angular需要发出XHR请求来获取模板,所以组件的编译将是异步。所以我们应该等到它解决后再继续测试。
在 Angular 2 中测试时,什么时候使用 TestBed 中的异步函数?
你什么时候用这个?
beforeEach(() => {
TestBed.configureTestingModule({
declarations: [MyModule],
schemas: [NO_ERRORS_SCHEMA],
});
});
你什么时候用这个?
beforeEach(async(() => {
TestBed.configureTestingModule({
declarations: [MyModule],
schemas: [NO_ERRORS_SCHEMA],
});
}));
任何人都可以启发我吗?
当您在测试中进行异步调用时,实际测试功能会在异步调用完成之前完成。 当您需要在调用完成时验证某些状态(通常是这种情况)时,测试框架会报告测试已完成,而异步工作仍在进行中。
使用 async(...)
你告诉测试框架等到 return promise 或 observable 完成后再将测试视为已完成。
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);
});
}));
传递给 then(...)
的代码将在测试函数本身完成后执行。
使用 async()
,您可以让测试框架知道,它需要等待 promises 和 observables 完成,然后才能将测试视为已完成。
另见
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);
});
});
测试甚至会在预期之前完成,因为承诺在测试完成同步任务执行后解析。
使用Angular(在Jasmine环境中),Angular实际上会在我们使用async
时在幕后调用done
。它会跟踪 Zone 中所有的异步任务,当它们全部完成时,done
将在幕后调用。
在您使用 TestBed
配置的特定情况下,您通常会在需要 compileComponents
时使用它。我很少 运行 遇到不得不调用它的情况
beforeEach(async(() => {
TestBed.configureTestingModule({
declarations: [MyModule],
schemas: [NO_ERRORS_SCHEMA],
})
.compileComponent().then(() => {
fixture = TestBed.createComponent(TestComponent);
});
}));
当测试使用templateUrl
的组件时(如果你没有使用webpack),那么Angular需要发出XHR请求来获取模板,所以组件的编译将是异步。所以我们应该等到它解决后再继续测试。