我正在学习Angular 2测试(Karma,Jasmine)。我已经对HTTP服务进行了工作测试,主要来自this Semaphore tutorial on services and testing。我通过通常的异步(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);
});
然而,我的&#34;智能&#34;程序员编辑(SublimeText)说&#34; Property&#39;然后&#39;类型&#39; void&#39;。&#34;上不存在,让我不确定我是否应该异步(注入或只使用tick()。
评论,有人吗?
谢谢, 杰罗姆。
答案 0 :(得分:0)
试试这个!
it('should get Option objects async',
async(inject([GlobalsService, MockOptionService], (globalsService: GlobalsService, optionService: OptionService) => {
globalsService.getGlobals()
.do(value => {
expect(value.length).toBe(1);
}).toPromise();
})));
答案 1 :(得分:0)
在摆弄并进行更多研究后,我想到了两件事: *我的测试错了。 globalsService.getGlobals()返回void。 .then或.do在说“属性不存在”时是正确的。
我改变测试工作的原因是添加一个setup子句,更改async(注入(对于fakeAsync(注入(以及修复注入和声明)。这是有效的:
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()中报告一个空错误变量。但这是针对不同的支持电话。
杰罗姆。