我正在尝试覆盖 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 被连接为一个 store 选择器(几乎和这里一样,但有点复杂)。我正在尝试测试此服务,特别是检查暴露的 myObservable$ 是否在特定商店安排下正确运行。
答案 0 :(得分:0)
虽然这不是您问题的直接答案,但该测试不会增加任何价值。
您正在创建一个选择器,模拟选择器,然后测试选择器是否返回模拟值。
<块引用>我正在尝试测试此服务,特别是检查暴露的 myObservable$ 是否在特定商店安排下正确运行。
当您模拟选择器时,它不会查看存储安排 - 它只返回模拟的返回值。
如果要测试一个选择器,最简单的方法是使用project方法。 有关详细信息,请参阅我的博文 How I test my NgRx selectors 或 docs。