【发布时间】: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,这应该很容易设置。如果需要,我很乐意提供帮助。