在我的 Angular 项目中,我有一个服务,用于状态管理以在组件之间共享一些数据,如下所示:
@Injectable({ providedIn: "root"})
export class NameStateService {
private _filteredNames$: Subject<Name[]> = new Subject();
private _filteredNamesObs$: Observable<Name[]>;
constructor() {
this._filteredNamesObs$ = this._filteredNames$.asObservable();
}
public updateFilteredNames(val: Name[]): void {
this._filteredNames$.next(val);
}
public get filteredNames$(): Observable<BillingAccount[]> {
return this._filteredNamesObs$;
}
}
状态管理基于 subject 和 observable,这是 rxjs 世界中的典型用法。
对于此服务的单元测试,我想使用rxjs/testing
模块支持的大理石测试功能。解决方案如下:
describe("Name state service ", () => {
let nameStateService: NameStateService;
let scheduler: TestScheduler;
beforeEach(() => {
TestBed.configureTestingModule({
providers: [
NameStateService
]
});
nameStateService = TestBed.get(NameStateService);
scheduler = new TestScheduler((actual, expected) => expect(actual).toEqual(expected));
});
it("should be created", () => {
expect(nameStateService).toBeTruthy();
});
it("should return a valid names observables", () => {
scheduler.run(({ cold, hot, expectObservable }) => {
const mockNames: Name[] = [{
title: "title1",
group: "group1"
}];
nameStateService.updateFilteredNames(mockNames);
expectObservable(nameStateService.filteredNames$).toBe("-b", {b: mockNames});
});
});
})
但是第二个单元测试失败并出现错误:Error: Expected $.length = 0 to equal 1.
所以这意味着nameStateService.filteredNames$
,这个 observable 在它的流中没有值。
这里有什么问题?