【发布时间】:2017-03-20 18:44:41
【问题描述】:
我正在编写一个 angular2 应用程序,但无法理解如何使用 jasmine 为异步代码编写测试。无论出于何种原因,我没有看到很多似乎非常适用于我的情况的示例。
我目前正在尝试测试对另一个服务具有异步依赖关系的服务(不是组件)。我不能 100% 确定在测试中的什么时候检查异步调用的结果是有效的。您可以在异步处理程序中为您的服务调用 expect() 吗?
service.foo()
.then((data) => {
//do I check the results in here?
expect(data).toEqual({ a: 1, b: 2 });
expect(mockDep.get).toHaveBeenCalled();
});
这是完整的测试。
import { TestBed, inject } from '@angular/core/testing';
import { MyService } from './my.service.ts';
import { MyDependency } from './dependency.service.ts';
class MockDependency {
doSomething(): Promise<any> {
throw Error('not implemented');
};
}
describe('some tests', () => {
beforeEach(() => {
TestBed.configureTestingModule({
providers: [
MyService,
{
provide: MyDependency, useClass: MockDependency
}
]
});
});
});
it('should do something', inject([MyService, MyDependency], (service: MyService, mockDep: MyDependency) => {
spyOn(mockDep, 'doSomething').and.callFake(function () {
return Promise.resolve({ a: 1, b: 2 });
});
service.foo()
.then((data) => {
//do I check the results in here?
expect(data).toEqual({ a: 1, b: 2 });
expect(mockDep.get).toHaveBeenCalled();
});
}));
【问题讨论】:
-
是的,通常你只需将
expect放在then中。您需要在异步测试中将inject与async或fakeAsync包装起来。
标签: unit-testing angular asynchronous jasmine