[英]Angular 2 mocking an async service that calls another service
我正在學習Angular 2測試(Karma,Jasmine)。 我已經有一個HTTP服務的工作測試,主要是從這個關於服務和測試的Semaphore教程中提取的。 我通過通常的異步(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'上不存在。”,讓我不確定我是否應該異步(注入或只使用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(注入(對於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()中報告一個空錯誤變量。 但這是針對不同的支持電話。
傑羅姆。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.