angular - Jest : mock RxJs pipe

标签 angular typescript rxjs jestjs ngrx

如何模拟更复杂的 RxJs 行为(在 NgRx 的上下文中)?

给定一个简单的组件 (SomeComponent):

export class SomeComponent implements OnInit {
  foo$: Observable<any>;
  bar$: Observable<any>;

  constructor(private store: Store<State>) {}

  ngOnInit() {
    this.foo$ = this.store.pipe(select(getFooSelector));
    this.bar$ = this.store.pipe(select(getBarSelector));
  }
}

我想模拟商店的方式是:

  • 基于传递的选择器,模拟商店返回不同的值。
  • 监视传递给 select 运算符的参数(选择器)。

基于传递的选择器,模拟商店返回不同的值

我会这样看:

store.pipe = jest.fn(selectOperator => {
  switch (selectOperator.arguments[0]) {
    case getFooSelector:
      return foo;
    case getBarSelector:
      return bar;
  }
}

监视传递给select 运算符的参数(选择器)。

类似的东西:

const spy = jest.spyOn(store, 'pipe');
expect(spy.mock.calls[0]).toHaveBeenCalledWith(select(getFooSelector));
expect(spy.mock.calls[1]).toHaveBeenCalledWith(select(getBarSelector));

总结

我知道这两个示例都是伪代码,但我希望它们能展示我正在努力实现的目标。如果我的方法完全错误,请对此发表评论。

最佳答案

使用RxJs Marbles用于使用 NgRx 测试 RxJs。

有关更多信息,请阅读 RxJS Marble Testing: RTFM看看Jest Testing - Jesse Sanders , Reactive Testing Strategies with NgRx - Brandon Roberts & Mike Ryan

实现使用jest.fn().mockImplementationOnce

store.pipe = jest.fn()
   .mockImplementationOnce(foo)
   .mockImplementationOnce(bar)

expect(store.pipe).toHaveBeenCalledWith(select(getFooSelector));
expect(store.pipe).toHaveBeenCalledWith(select(getBarSelector));

关于angular - Jest : mock RxJs pipe,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52532587/

相关文章:

angular - 如何将动态 Facebook 和谷歌客户 ID 放在 angularx-social-login 上?

javascript - ngx-cookie - 服务器端渲染中的空白 cookie 对象

javascript - 如何在 TypeScript 中使用函数类型

rxjs - 缓存来自 BehaviorSubject 的管道结果

angular - ngrx 商店选择器在从自定义库导入应用程序时失败

angular - 我可以拥有一个不呈现伪元素的组件吗?

json - 将 Typescript 接口(interface)与递归 JSON 结合使用

typescript - 在 typescript 中,如何定义异步函数的类型

angular - 处理异步 NgRx 操作

javascript - 如何在 Angular 中获取事件路由快照 onpopstate 事件