【问题标题】:How to unit test NgRx selector observables如何对 NgRx 选择器可观察对象进行单元测试
【发布时间】:2021-09-29 22:11:33
【问题描述】:

我正在尝试覆盖 NgRx 选择器并从 observable 输出覆盖的值。

在我看来,对 overrideSelector() 的调用没有按我的预期工作。当我测试 observable 时,此覆盖的结果不会反映在最终断言中。

鉴于以下最小复制示例,我如何才能通过此测试?

import { TestBed } from '@angular/core/testing';
import { MockStore, provideMockStore } from '@ngrx/store/testing';
import { cold } from 'jest-marbles';
import { createFeatureSelector, createSelector, select } from '@ngrx/store';

let store: MockStore<any>;

beforeEach(() => {
  TestBed.configureTestingModule({
    imports: [],
    providers: [provideMockStore({ initialState: { feature: { myValue: 'initial value' } } })]
  });

  store = TestBed.inject(MockStore);
});

it('should emit the overridden selector value', () => {
  const featureSelector = createFeatureSelector<any>('feature');
  const mySelector = createSelector(featureSelector, (state: any) => state.myValue);
  const myObservable$ = store.pipe(select(mySelector));

  store.overrideSelector(mySelector, 'some new value');
  store.refreshState();

  const expected = cold('a', { a: 'some new value' });
  expect(myObservable$).toBeObservable(expected); // Fails.  The emmitted value is still 'initial value'
});

作为一个有趣的附注。如果我在测试中实际订阅了 myObservable$,那么发出的值就是我所期望的。

  myObservable$.subscribe((val) => {
    console.log(val); // logs: 'some new value'
  });

对于一些额外的上下文,这是一个最小的复制。我实际上有一个服务,它公开了 myObservable$ 的等价物。在内部,这个 observable 被连接为一个存储选择器(几乎和这里一样,但有点复杂)。我正在尝试测试此服务,特别是检查暴露的 myObservable$ 在特定商店安排下的行为是否正确。

【问题讨论】:

  • 你能在 StackBlitz 应用程序中复制这个问题吗? Here 将是一个起点。
  • @AndreiGătej 实际上,不,我无法在 StackBlitz 中复制它。我已经完全按照此处显示的方式粘贴了代码,并且只进行了必要的更改以使其在 jasmine 下运行。这一切都完全按照我的预期工作。这可能是开玩笑特有的吗?
  • 有趣。我不能确定发生了什么,但我认为如果您使用调试器并检查您在那里使用的库的源代码,您可以了解更多信息。如果您使用的是 VS Code,这应该很容易设置。如果需要,我很乐意提供帮助。

标签: angular rxjs jestjs ngrx


【解决方案1】:

虽然这不是您问题的直接答案,但此测试不会增加任何价值。

您正在创建一个选择器,模拟选择器,然后测试选择器是否返回模拟值。

我正在尝试测试此服务,特别是检查暴露的 myObservable$ 在特定商店安排下的行为是否正确。

当您模拟选择器时,它不会查看存储安排 - 它只是返回模拟的返回值。

如果你想测试一个选择器,最简单的方法是使用项目方法。 请参阅我的博文How I test my NgRx selectors 或docs 了解更多信息。

【讨论】:

  • 是的,也许我的问题标题措辞不正确。我不是要测试选择器。我正在尝试测试使用这些选择器的服务,因此我正在尝试模拟(覆盖)它们的输出。
猜你喜欢
  • 1970-01-01
  • 2018-04-28
  • 2020-08-02
  • 1970-01-01
  • 2022-01-24
  • 1970-01-01
  • 2021-04-12
  • 1970-01-01
  • 2021-04-25
相关资源
最近更新 更多