Angular 4测试:使用Inject进行fakeAsync

时间:2017-10-29 20:00:52

标签: angular testing jasmine inject

我正在尝试使用私有方法测试服务,该方法在构造函数中调用并包含observable:

import {Injectable} from '@angular/core';
import {Observable} from 'rxjs/Observable';
import 'rxjs/add/observable/interval';

@Injectable()
export class SomeService {

  private booleanValue: boolean = false;

  constructor() {
    this.obsMethod();
  }

  private obsMethod() {
    Observable.interval(5000).subscribe(() => {
      this.booleanValue = !this.booleanValue;
    });
  }

  public getBooleanValue() {
    return this.booleanValue;
  }
}

我准备了三个规格。首先使用new运算符创建的简单服务实例。它有效。第二次注射TestBed.get()。它也有效。

我在inject规范中使用beforeEach时无效。但为什么?同时使用fakeAsyncinject是否有问题?我如何一起使用它们?

我使用服务和三个规格在plunker上创建了工作演示。

https://embed.plnkr.co/dw6tCGXH6LWlJuqNuQl8/

1 个答案:

答案 0 :(得分:0)

第三个规范的问题是,可观察区间是在fakeAsync()函数之外创建的,这意味着它使用了真正的setInterval()函数,因此测试函数中的所有断言都运行在5秒之前,所以对更改值的最后一次断言测试失败。

我实现此方法的一种方法是将observable的初始化分离为单独的init()方法,然后可以在测试中从fakeAsync()函数内部调用以允许{{ 1}}正常工作。

updated Plunkr is here

相关代码:

服务:

tick()

最终测试:

@Injectable()
export class SomeService {

  private booleanValue: boolean = false;

  constructor() {
  }

  public init() {
    this.obsMethod();
  }

  private obsMethod() {
    Observable.interval(5000).subscribe(() => {
        this.booleanValue = !this.booleanValue;
    });
  }

  public getBooleanValue() {
    return this.booleanValue;
  }
}