You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何测试带有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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.13 06:22:07