我正在学习 Angular 2 测试(Karma、Jasmine)。我已经对 HTTP 服务进行了工作测试,主要来自 this Semaphore tutorial on services and testing .我通过通常的 async(inject([MyService], ...
我的实际程序有一个服务包装在服务中,如下所示。
@Injectable()
export class GlobalsService {
private options: Option[] = [];
error: any;
constructor(private optionService: OptionService) { }
public getGlobals(): void {
let that = this;
this.optionService
.getOptions()
.then(options => that.fillOptions(options))
.catch(error => that.error = error);
}
[SNIP]
optionService.getOptions() 返回一个等待的 Promise,然后填充 globalService.options 列表。 globalsService.getGlobals() 被同步调用或在其内容的异步(延迟)填充被隐藏的地方被调用。
export class AppComponent implements OnInit {
constructor(private globalsService: GlobalsService) { }
ngOnInit() {
this.globalsService.getGlobals();
}
[SNIP]
我遇到的问题是如何在测试上下文中调用 globalsService.getGlobals()。我想我应该通过 async() 调用它。
到目前为止,我的模拟 OptionService 是:
@Injectable()
export class MockOptionService {
constructor() { }
getOptions(): Promise<Option[]> {
let options: Option[] = [
{ id: 'NY' } // truncated property list
];
return Promise.resolve(options);
}
}
然后我打算通过以下方式调用它:
it('should get Option objects async',
async(inject([GlobalsService, MockOptionService], (globalsService: GlobalsService, optionService: OptionService) => {
globalsService.getGlobals()
.then(() => {
expect(globalsService.getOptions().length).toBe(1);
});
但是,我的“聪明”程序员编辑器 (SublimeText) 说“'void' 类型上不存在属性 'then'。”,让我不确定我是否应该使用异步(注入(inject)或只使用 tick()。
评论,有人吗?
谢谢, 杰罗姆。
最佳答案
试试这个!
it('should get Option objects async',
async(inject([GlobalsService, MockOptionService], (globalsService: GlobalsService, optionService: OptionService) => {
globalsService.getGlobals()
.do(value => {
expect(value.length).toBe(1);
}).toPromise();
})));
关于Angular 2模拟调用另一个服务的异步服务,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41971205/