如何从mockStore.overrideSelector()重新分配值?

Kod*_*_12 6 unit-testing ngrx angular

我有一个返回布尔值的选择器。对于我的单元测试,我需要测试该值何时为真或为假。

默认情况下,在测试设置中,我有以下内容:

mockStore.overrideSelector(someSelector, true);
Run Code Online (Sandbox Code Playgroud)

我需要将选择器中的值更改为 false,但是当我尝试以下操作时:

mockStore.resetSelectors();
mockStore.overrideSelector(someSelector, false);
mockStore.refreshState();
spectator.detectChanges();
Run Code Online (Sandbox Code Playgroud)

选择器仍然返回 true。

如何重新分配之前通过 overrideSelector 方法设置的值?

GKA*_*GKA 5

正如官方文档Ngrx 测试中提到的

要更新模拟选择器以返回不同的值,请使用 MemoizedSelector 的 setResult() 方法。更新选择器的模拟值不会导致它自动发出。要触发所有选择器的发射,请在更新所需的选择器后使用 MockStore.refreshState() 方法。

所以这样的事情应该有效......

const mockSelector = mockStore.overrideSelector(someSelector, true);
...
...
mockSelector.setResult(false);
mockStore.refreshState();
Run Code Online (Sandbox Code Playgroud)

如果选择器返回一个对象而不是像trueor 这样的基元falserefreshState则似乎只有在返回对象的副本而不是原始对象时才检测到您已更改值。

const obj = { foo: 'bar' };
mockStore.overrideSelector(objSelector, obj);
...
...
obj.foo = 'baz';

// INCORRECT; selector won't emit again
// mockSelector.setResult(obj);

// CORRECT; make a deep copy of the object
mockSelector.setResult(JSON.parse(JSON.stringify(obj)));

mockStore.refreshState();
Run Code Online (Sandbox Code Playgroud)