NestJS - 测试套件无法运行从“comment/comment.entity.ts”中找不到模块“src/article/article.entity”
Posted
技术标签:
【中文标题】NestJS - 测试套件无法运行从“comment/comment.entity.ts”中找不到模块“src/article/article.entity”【英文标题】:NestJS - Test suite failed to run Cannot find module 'src/article/article.entity' from 'comment/comment.entity.ts' 【发布时间】:2020-12-31 01:49:26 【问题描述】:我需要有关 nestjs 和 jest 测试的帮助。我是 NestJS 新手,在运行测试时遇到了找不到模块错误。
我正在尝试测试我的服务,当我运行测试时收到错误消息:
src/article/article.service.spec.ts ● 测试套件无法运行
Cannot find module 'src/article/article.entity' from 'comment/comment.entity.ts'
Require stack:
comment/comment.entity.ts
article/article.entity.ts
article/article.service.spec.ts
6 | ManyToOne,
7 | from 'typeorm';
> 8 | import Article from 'src/article/article.entity';
| ^
9 |
10 | @Entity()
11 | export class Comment
at Resolver.resolveModule (../node_modules/jest-resolve/build/index.js:307:11)
at Object.<anonymous> (comment/comment.entity.ts:8:1)
这个类似的错误在不同的控制器、服务等的所有其他测试中都出现了。
这是我要测试的代码。
article.service.ts
import Injectable from "@nestjs/common";
import InjectRepository from "@nestjs/typeorm";
import Article from "./article.entity";
import ArticleRepository from "./article.repository";
import ArticleDTO from "./dto/article.dto";
import DeleteResult from "typeorm";
import ArticleRO from "./dto/article.response";
import UserRepository from "src/user/user.repository";
@Injectable()
export class ArticleService
constructor(
private readonly articleRepository: ArticleRepository,
private readonly userRepository: UserRepository
)
async getAllPosts(): Promise<ArticleRO[]>
return await this.articleRepository.find();
article.repository.ts
import Repository, EntityRepository from 'typeorm';
import Article from './article.entity';
@EntityRepository(Article)
export class ArticleRepository extends Repository<Article>
article.service.specs.ts
import Test, TestingModule from "@nestjs/testing";
import getRepositoryToken from "@nestjs/typeorm";
import Article from "./article.entity";
import ArticleRepository from "./article.repository";
import ArticleService from "./article.service";
import ArticleRO from "./dto/article.response";
describe("PostService", () =>
let service: ArticleService;
let articleRepository: ArticleRepository;
beforeEach(async () =>
const module: TestingModule = await Test.createTestingModule(
providers: [
ArticleService,
provide: getRepositoryToken(Article),
useClass: ArticleRepository,
,
],
).compile();
service = module.get<ArticleService>(ArticleService);
articleRepository = module.get<ArticleRepository>(
getRepositoryToken(Article)
);
);
it("should be defined", () =>
expect(service).toBeDefined();
);
describe("findAll", () =>
it("should return an array of cats", async () =>
const result: ArticleRO[] = [];
jest.spyOn(service, "getAllPosts").mockResolvedValueOnce(result);
expect(await service.getAllPosts()).toBe(result);
);
);
);
comment.entity.ts
import
Entity,
Column,
PrimaryGeneratedColumn,
CreateDateColumn,
ManyToOne,
from 'typeorm';
import Article from 'src/article/article.entity';
@Entity()
export class Comment
@PrimaryGeneratedColumn()
id: number;
@Column()
author: string;
@Column()
content: string;
@CreateDateColumn()
createdAt: Date;
@ManyToOne(
() => Article,
article => article.comments,
)
article: Article;
package.json 中有我的笑话设置。
"jest":
"moduleFileExtensions": [
"js",
"json",
"ts"
],
"rootDir": "src",
"testRegex": ".spec.ts$",
"transform":
"^.+\\.(t|j)s$": "ts-jest"
,
"coverageDirectory": "../coverage",
"testEnvironment": "node"
我尝试将我的 rootDir 更改为“./src”,但这不起作用。
我用 nest new blabla 生成了项目。所以我的笑话设置是默认的。也许我在测试中模拟自定义存储库时做错了。
【问题讨论】:
如果没有兼容的加载器,您将无法使用基本 URL。 nodejs 加载器不是 【参考方案1】:不要在你的应用程序中使用像“src/article/article.entity”这样的路径,这些在编译后不可用。取而代之的是像“../../article/article.entity”这样的相对路径(这只是一个猜测的路径)......问候
【讨论】:
使用绝对路径是开发人员的选项,请参阅@Parziphal 的回答,无论如何感谢您的信息。 对我来说,这个解决方案很有效,就像魔术一样。浪费时间后,只是做了这个简单的技巧并奏效了!【参考方案2】:您可以通过配置 moduleNameMapper 选项告诉 Jest 如何解析模块路径,如果您使用像 module-alias 这样的包或,如果您使用绝对路径,这很有用。将这些行添加到您的 Jest 配置中:
// ...
"jest":
// ...
"moduleNameMapper":
"^src/(.*)$": "<rootDir>/$1"
现在以src/
开头的模块将在<rootDir>/
中查找,默认情况下是src
文件夹(这在上面配置了几行)。查看上面的文档链接,了解您可以用它做的所有事情。
我不知道使用绝对路径有什么问题,正如其他回复所说的那样,它不仅有用,而且在 NestJS 和 Angular 中都可以正常工作。
【讨论】:
那个 sn-p 不起作用,它必须再次指定实际的path
映射时像 "^src/(.*)$": "<rootDir>/src/$1"
对我有用!【参考方案3】:
更改为相对导入
还有 VSCode 设置来自动完成。
我不得不更改我的 VSCode 导入设置以使用 TypeScript 的相对路径。默认情况下,VSCode 使用“最短”路径导入,看起来像 src/auth/user.entity
。我的 NestJS 应用程序编译正常,但我遇到了和你一样的 Jest 测试错误。
将 TypeScript › Preferences: Import Module Specifier 设置更改为 relative 后,模块将像 ../auth/user.entity
一样导入。 (确保您正在更改 TypeScript 的设置,因为 javascript 的设置相同。我都更改了。)。
进行这些模块导入更改修复了我的 NestJS Jest 测试问题,类似 Cannot find module 'src/article/article.entity' from 'comment/comment.entity.ts' 样式错误。
有关更改 VSCode 打字稿首选项的更多详细信息在这里:https://***.com/a/53137571/8177355
【讨论】:
以上是关于NestJS - 测试套件无法运行从“comment/comment.entity.ts”中找不到模块“src/article/article.entity”的主要内容,如果未能解决你的问题,请参考以下文章