angular - 带有 Jest 的 Angular:因无法使用不同的导入找到提供者而失败的测试
问题描述
我有一个带有 Jest 的 Angular 应用程序,所有测试都运行良好。组件注入服务:
组件.ts:
import { FooService } from '../../services/foo.service'; // relative import
constructor(private foo: FooService) {}
组件.spec.ts:
import { FooService } from '@services/foo.service'; // alias import
describe('FooComponent', () => {
let component: FooComponent;
let fixture: ComponentFixture<FooComponent>;
beforeEach(waitForAsync(() => {
TestBed.configureTestingModule({
imports: [....],
providers: [ { provide: FooService, useValue: { bar: () => {} } ],
declarations: [FooComponent],
schemas: [NO_ERRORS_SCHEMA]
})
.compileComponents();
....
}));
});
两个导入指的是相同的 foo.service.ts
,但使用不同的导入形式:TypeScript alias vs relative path。
别名在 tsconfig.json 中定义:
"paths": {
"@services/*": ["./app/services/*"]
}
和 Jest 配置:
"moduleNameMapper": {
"@services/(.*)": "<rootDir>/src/app/services/$1"
}
我已切换到 nx 工作区,并且测试开始失败,并出现错误提示FooService没有提供程序:
NullInjectorError: R3InjectorError(DynamicTestModule)[FooService -> FooService]:
NullInjectorError: No provider for FooService!
我已经设法使用相同形式的导入来修复它- 服务和测试都必须使用别名导入或相对导入。
我想了解这里有什么问题。看起来 Angular/Jest 正在基于 TypeScript 路径(在 Nx 工作区中)进行注入令牌/依赖项解析。有什么解释这是如何工作的吗?
解决方案
推荐阅读
- javascript - 如何从插件外部调用 Jquery 插件功能
- python - 逐行解析数据帧
- php - 如何在php中上传带有水印和密码的pdf文件?那个时候上传pdf文件可以吗?
- java - 数组的字符串版本到 ArrayList
- ios - React Native 项目版本升级报错:v0.56 到 v0.60,iOS 失败
- html - 将文本与复选框对齐
- php - 类 RedirectIfPasswordNotUpdated 不存在
- php - 我正在开发一个视频网站,管理员将在其中上传 1 GB 大小的视频,我可以使用什么服务器以便它可以在前端正常播放
- git - Git,从本地分支(我的电脑)更新远程分支(bitbucket 存储库)
- xml - 如何更改 MarkLogic 中元素的名称