Angular 2模拟调用另一个服务的异步服务
我正在学习角度2测试(Karma,Jasmine)。我已经有了一个HTTP服务的工作测试,主要是从。我通过通常的异步(inject([MyService]),使测试正常工作 我的实际程序将服务包装在服务中,如下所示Angular 2模拟调用另一个服务的异步服务,angular,testing,mocking,karma-jasmine,angular-promise,Angular,Testing,Mocking,Karma Jasmine,Angular Promise,我正在学习角度2测试(Karma,Jasmine)。我已经有了一个HTTP服务的工作测试,主要是从。我通过通常的异步(inject([MyService]),使测试正常工作 我的实际程序将服务包装在服务中,如下所示 @Injectable() export class GlobalsService { private options: Option[] = []; error: any; constructor(private optionService: OptionServic
@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()返回一个等待的承诺,然后填充globalService.options列表。globalService.getGlobals()被同步调用或在其内容的异步(延迟)填充被隐藏的位置调用
export class AppComponent implements OnInit {
constructor(private globalsService: GlobalsService) { }
ngOnInit() {
this.globalsService.getGlobals();
}
[SNIP]
我一直在研究如何在测试上下文中调用globalsService.getGlobals(),我想我应该通过async()调用它
到目前为止,我的模拟选项服务是:
@Injectable()
export class MockOptionService {
constructor() { }
getOptions(): Promise<Option[]> {
let options: Option[] = [
{ id: 'NY' } // truncated property list
];
return Promise.resolve(options);
}
}
然而,我的“智能”程序员编辑器(SublimiteText)说“属性”then“在类型'void'上不存在”,这让我不确定是应该使用async(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();
})));
经过反复研究,我发现了两件事: *我的测试是错误的。globalsService.getGlobals()返回void。then或.do表示“属性不存在”是正确的 为了使测试能够工作,我所做的更改是添加一个setup子句,将async(inject)更改为fakeAsync(inject),并修复注入和声明。以下是有效的方法:
describe('Globals Service', () => {
beforeEach(() => {
TestBed.configureTestingModule({
providers: [
{ provide: OptionService, useClass: MockOptionService },
{ provide: GlobalsService, useClass: GlobalsService }
]
});
});
fakeAsync(inject([GlobalsService, OptionService], (globalsService: GlobalsService, optionService: OptionService) => {
globalsService.getGlobals();
tick();
expect(globalsService.getOptions().length).toBe(1);
})));
});
感谢大家的关注,感谢Nidhin的回复。现在我正在处理我的error()处理——即在handleError()中报告一个null错误变量。但这是另一个支持调用
杰罗姆。没有改变任何事情。请看下面我的答案。
describe('Globals Service', () => {
beforeEach(() => {
TestBed.configureTestingModule({
providers: [
{ provide: OptionService, useClass: MockOptionService },
{ provide: GlobalsService, useClass: GlobalsService }
]
});
});
fakeAsync(inject([GlobalsService, OptionService], (globalsService: GlobalsService, optionService: OptionService) => {
globalsService.getGlobals();
tick();
expect(globalsService.getOptions().length).toBe(1);
})));
});