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/ 开头的模块将在&lt;rootDir&gt;/ 中查找,默认情况下是src 文件夹(这在上面配置了几行)。查看上面的文档链接,了解您可以用它做的所有事情。

我不知道使用绝对路径有什么问题,正如其他回复所说的那样,它不仅有用,而且在 NestJS 和 Angular 中都可以正常工作。

【讨论】:

那个 sn-p 不起作用,它必须再次指定实际的 path 映射时像 "^src/(.*)$": "&lt;rootDir&gt;/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”的主要内容,如果未能解决你的问题,请参考以下文章

无法编译 TestNG 测试套件(Maven+Surefire)

测试套件无法运行

测试套件无法运行 - 找不到模块“打字稿”

无法使用phpunit运行测试套件

开玩笑:测试套件无法运行,意外令牌 =

测试套件无法运行 TypeError:无法读取未定义的属性“默认”