使用ngrx/effects测试Effects时遇rxjs/testing模块找不到错误求助
解决NGRX Effects测试中"Cannot find module 'rxjs/testing'"的问题
我之前也踩过这个坑,大概率是依赖版本不兼容或者依赖安装不完整导致的,给你几个实用的解决方向:
1. 对齐依赖版本是核心
jasmine-marbles和rxjs、@ngrx/effects的版本必须匹配,这是最常见的触发原因:
- 如果你的
rxjs版本低于6.5.0,rxjs/testing模块根本不存在,得先把rxjs升级到和Angular版本匹配的稳定版(比如Angular 14+对应rxjs 7.x)。 - 同时要保证
jasmine-marbles的版本和rxjs兼容:rxjs 7+对应jasmine-marbles@^0.8.x,rxjs 6对应jasmine-marbles@^0.6.x。
直接执行命令更新依赖(根据你的项目版本调整):
# 升级rxjs到兼容版本 npm install rxjs@^7.8.1 --save # 安装对应版本的jasmine-marbles npm install jasmine-marbles@^0.8.0 --save-dev
2. 检查TestBed配置是否正确
有时候是测试文件的配置遗漏了必要项,你可以把测试代码调整成这样先跑通基础用例:
import { TestBed } from '@angular/core/testing'; import { provideMockActions } from '@ngrx/effects/testing'; import { ReplaySubject } from 'rxjs'; import { hot, cold } from 'jasmine-marbles'; import { Observable } from 'rxjs'; import { YourEffects } from './your-effects'; // 替换成你的Effects类 describe('YourEffects', () => { let actions$: ReplaySubject<unknown>; let effects: YourEffects; beforeEach(() => { TestBed.configureTestingModule({ providers: [ YourEffects, provideMockActions(() => actions$) ] }); effects = TestBed.inject(YourEffects); actions$ = new ReplaySubject(1); }); it('should be created', () => { expect(effects).toBeTruthy(); }); });
3. 清除缓存重新安装依赖
npm缓存偶尔会导致依赖安装不完整,执行以下命令重置:
# 删除node_modules和锁文件 rm -rf node_modules package-lock.json # 清除npm缓存 npm cache clean --force # 重新安装所有依赖 npm install
4. 检查tsconfig.spec.json配置
确保你的测试环境tsconfig没有排除rxjs的模块,可添加路径映射确保解析正确:
{ "compilerOptions": { "paths": { "rxjs": ["node_modules/rxjs"], "rxjs/*": ["node_modules/rxjs/*"] } } }
先从版本对齐开始尝试,这是解决这个问题最直接的办法。
内容的提问来源于stack exchange,提问作者Thomas Betous
相关产品推荐
相关产品推荐

