【发布时间】:2018-11-08 16:02:49
【问题描述】:
我正在尝试测试一个返回 observable 并调用另一个函数的身份验证守卫。我的后卫看起来像这样(从 Todd Motto 解除。干杯 Todd):
@Injectable()
export class ProductSummaryLoadedGuard implements CanActivate {
constructor(private store: Store<fromProductStore.State>) {}
canActivate(): Observable<boolean> {
return this.checkStore().pipe(
switchMap(() => of(true)),
catchError(() => of(false))
);
}
checkStore(): Observable<boolean> {
return this.store.pipe(select(fromProductStore.selectProductLoaded)).pipe(
tap(loaded => {
if (!loaded) {
this.store.dispatch(new fromProductStore.LoadProductSummary());
}
}),
filter(loaded => loaded),
take(1)
);
}
}
我已经为此整理了规范的框架,导致问题的摘录是这样的:
it('should return true when checkStore() returns true', () => {
spyOn(guard, 'checkStore').and.returnValue(of(true));
const result = guard.canActivate();
expect(result).toBeObservable(of(true));
});
执行此规范时,我在 Karma 中遇到此错误:
TypeError:无法读取未定义的属性“indexOf” 在 Function.TestScheduler.parseMarbles (./node_modules/rxjs/_esm5/internal/testing/TestScheduler.js?:243:21)
我在这里缺少什么?我不想只为这一种方法使用大理石测试,但如果有人可以建议一种方法,那么我很乐意尝试!
【问题讨论】:
-
这里是在黑暗中拍摄的完整照片,但是如果您将
expect行更改为result.subscribe(res => expect(res).toEqual(true))是否有效?我想知道,因为 .toBeObservable() 匹配器来自大理石测试库,也许他们的代码有问题。 -
我看到了同样的事情!您找到解决方案或解决方法了吗@serlingpa?
-
这是因为来自
toBeObservable(expectedObservable)的expectedObservable应该是具有marbles属性的TestObservable(TestColdObservable | TestHotObservable)。您需要使用cold()或hot()函数来创建一个。 medium.com/@bencabanes/… -
@NickDarvey 不知道你在说什么:/你能写一个答案并添加一些具体细节吗?
标签: angular unit-testing jasmine rxjs karma-runner