簡體   English   中英

Angular 2模擬調用另一個服務的異步服務

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM