Angular 2模拟调用另一个服务的异步服务

标签 angular testing mocking karma-jasmine angular-promise

我正在学习 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/

相关文章:

Angular 7 应用程序无法在 IE11 中运行(互联网探索)出现错误 : SCRIPT1002

java - Mockito Verify 方法如何工作?

Ruby rspec 模拟一个类

unit-testing - 如何使用 Angular 翻译进行单元测试

angular - 引用外部 typescript 文件时如何避免 "Module not found: Error: Can' t resolve 'tslib' "-error?

angular - 使用 istanbul-combine 合并覆盖率报告

testing - 如何在 Godot 引擎中编写测试

java - PowerMock:java.lang.IllegalAccessError:模拟 java.util.ServiceLoader 时的 java.lang.Class

mocking - 生成的服务模拟 : everything but RhinoMocks fails?

angular - 无法绑定(bind)到 'formGroup',因为它不是 'form' 的已知属性。 ionic v5.2.2 中的错误