我正在尝试使用私有方法测试服务,该方法在构造函数中调用并包含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
时无效。但为什么?同时使用fakeAsync
和inject
是否有问题?我如何一起使用它们?
我使用服务和三个规格在plunker上创建了工作演示。
答案 0 :(得分:0)
第三个规范的问题是,可观察区间是在fakeAsync()
函数之外创建的,这意味着它使用了真正的setInterval()
函数,因此测试函数中的所有断言都运行在5秒之前,所以对更改值的最后一次断言测试失败。
我实现此方法的一种方法是将observable的初始化分离为单独的init()
方法,然后可以在测试中从fakeAsync()
函数内部调用以允许{{ 1}}正常工作。
相关代码:
服务:
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;
}
}