typescript NestJS -测试套件未能运行无法从“comment/comment.entity.ts”中找到模块“src/article/article.entity”

cl25kdpy  于 2023-01-10  发布在  TypeScript
关注(0)|答案(6)|浏览(146)

我需要帮助nestjs和jest测试。我是新的NestJS和我卡住了找不到模块错误时,我运行测试。
我正在尝试测试我的服务,当我运行测试时,我收到错误消息:
src/article/文章.服务.规范.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设置。

"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生成了一个项目。所以我的jest设置是默认的。也许我在测试中对我的自定义仓库的模仿做错了什么。

vnzz0bqm

vnzz0bqm1#

不要在你的应用中使用“src/article/article.entity”这样的路径,这些路径在编译后是不可用的。2而是使用相对路径,如“../../article/article.entity”(这只是一个猜测的路径)...

k10s72fa

k10s72fa2#

您可以通过配置moduleNameMapper选项来告诉Jest如何解析模块路径,如果您使用的是module-alias * 或 * 之类的包(如果您使用的是绝对路径),则该选项非常有用。

{
  // ...

  "jest": {
    // ...

    "moduleNameMapper": {
      "^src/(.*)$": "<rootDir>/$1"
    }
  }
}

现在,以src/开头的模块将被查找到<rootDir>/中,默认情况下,<rootDir>/src文件夹(上面几行对此进行了配置)。请查看上面的文档链接,了解您可以使用此文件夹执行的所有操作。
我不知道使用绝对路径有什么问题,因为其他答复说,它不仅是有用的,但它也工作得很好,在NestJS和Angular 。

unguejic

unguejic3#

更改为相对导入

  • VSCode设置可以自动执行此操作。*

我不得不更改我的VSCode导入设置以使用TypeScript的相对路径。默认情况下,VSCode是使用“最短”路径导入的,看起来像src/auth/user.entity。我的NestJS应用程序编译正常,但我得到了和你一样的Jest测试错误。
更改设置后TypeScript ›首选项:将模块说明符导入到relative中,模块的导入类似于../auth/user.entity。(确保您正在更改TypeScript的设置,因为JavaScript有一个相同的设置。我更改了两者。)
进行这些模块导入更改修复了我的NestJS Jest测试问题,类似的 * 无法从“comment/comment.entity. ts”中找到模块“src/article/article.entity”* 样式错误。

有关更改VSCode类型脚本首选项的详细信息,请访问此处https://stackoverflow.com/a/53137571/8177355

wkyowqbh

wkyowqbh4#

右键单击文件,然后单击**"复制相关路径"**并粘贴和删除文件扩展名
例如:

import { function_name } from '/paste full relevant path to here and remove extenstion'
kq0g1dla

kq0g1dla5#

相对导入而不是绝对导入!!!

  • 例如:* x1c 0d1x
import { AppModule } from '../src/app.module';
2mbi3lxu

2mbi3lxu6#

我遇到了同样的问题,但通过在/test/jest-e2e.json中添加以下代码行解决了这个问题

"moduleNameMapper": {
    "^src/(.*)": "<rootDir>/../src/$1"
  }

相关问题