Angular 4 测试:带注入的 fakeAsync

Coo*_*sec 1 testing inject jasmine angular

我正在尝试使用在构造函数中调用并包含可观察的私有方法来测试服务:

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;
  }
}
Run Code Online (Sandbox Code Playgroud)

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

当我injectbeforeEach规范中使用时不起作用。但为什么?同时使用fakeAsyncinject使用有问题吗?我怎样才能同时使用它们?

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

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

Gre*_*egL 5

第三个规范的问题是间隔 observable 是在fakeAsync()函数外部创建的,这意味着它使用真实setInterval()函数,因此测试函数中的所有断言在 5 秒之前运行良好,因此最后一个断言测试用于更改值失败。

我让这个工作的一种方法是将 observable 的初始化分离到一个单独的init()方法中,然后可以从fakeAsync()测试中的函数内部调用它以允许tick()正常工作。

更新Plunkr在这里

相关代码:

服务:

@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;
  }
}
Run Code Online (Sandbox Code Playgroud)

最后一个考试:

describe('Some service specs with beforeEach Inject', () => {

  let serv: SomeService;

  beforeEach(() => {
    TestBed.configureTestingModule({
      providers: [
        SomeService
      ]
    });
  });

  beforeEach(inject([SomeService], (ss) => {
    serv = ss;
  }));

  it('Third - not working spec', fakeAsync(() => {
    serv.init();
    expect(serv.getBooleanValue()).toBe(false);
    tick(5000 - 1);
    expect(serv.getBooleanValue()).toBe(false);
    tick(2);
    expect(serv.getBooleanValue()).toBe(true);
    discardPeriodicTasks();
  }));
});
Run Code Online (Sandbox Code Playgroud)