如何测试带有pipe(skip(1))的Angular NGRX选择器订阅?
如何测试带有skip(1)操作符的Observable
你遇到的核心问题是skip(1)会跳过Observable发射的第一个值,而你的测试只触发了一次状态发射,导致subscribe回调永远不会执行,自然无法走到断言环节。
要解决这个问题,你需要在测试中模拟两次状态更新:第一次发射的初始值会被skip(1)跳过,第二次发射的目标值才会被subscribe接收。
修改后的测试代码示例:
it('should getSomething', fakeAsync(() => { // Arrange // 1. 设置初始状态(会被skip(1)跳过) const initialState = []; store.overrideSelector(selectSomeStatus, initialState); store.refreshState(); // Act component.getSomething(); tick(); // 2. 模拟状态更新,发射第二个值(这才会被subscribe接收) const targetState = ['your-test-data']; store.overrideSelector(selectSomeStatus, targetState); store.refreshState(); tick(); // Assert // 这里可以添加断言,比如验证subscribe里的逻辑是否执行 // 示例:如果subscribe里调用了某个方法,可以用spyOn来断言 // expect(someMethodSpy).toHaveBeenCalledWith(targetState); }));
额外说明:
- 如果你使用NgRx,
refreshState()会触发selector发射当前设置的值,两次调用就能模拟两次状态变化。 - 若需要更精细控制Observable的发射流程,可以使用RxJS的
TestScheduler,但对于这种简单场景,fakeAsync配合两次状态更新已经足够解决问题。
内容的提问来源于stack exchange,提问作者John
相关产品推荐
相关产品推荐

