typescript - NestJS - Test paketi çalıştırılamadı 'comment/comment.entity.ts' dosyasından 'src/article/article.entity' modülü bulunamadı
NestJS ve Jest testi ile ilgili yardıma ihtiyacım var. NestJS'e yeniyim ve testleri çalıştırırken 'Modül bulunamadı' hatasında takıldım.
Servisimi test etmeye çalışıyorum ve testleri çalıştırdığımda hata mesajı aldım:
src/article/article.service.spec.ts ● Test paketi çalıştırılamadı
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)
Bu benzer hata, diğer tüm testlerde farklı kontrolcüler, servisler vb. üzerinden de ortaya çıkıyor.
Denemek istediğim kod işte burada.
makale.servis.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();
}
}
makale.depo.ts
import { Repository, EntityRepository } from 'typeorm';
import { Article } from './article.entity';
@EntityRepository(Article)
export class ArticleRepository extends Repository<Article> {
}
makale.hizmet.spesifikasyonları.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);
});
});
});
yorum.varlık.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;
}
İşte package.json dosyamdaki jest ayarlarım.
"jest": {
"moduleFileExtensions": [
"js",
"json",
"ts"
],
"rootDir": "src",
"testRegex": ".spec.ts$",
"transform": {
"^.+\\.(t|j)s$": "ts-jest"
},
"coverageDirectory": "../coverage",
"testEnvironment": "node"
}
rootDir'imi "./src" olarak değiştirmeyi denedim ama bu çalışmıyor.
Projeyi nest new blabla ile oluşturdum. Yani jest ayarlarım varsayılan. Belki testlerde özel repository mocking ile bir şeyleri yanlış yapıyorum.
Cevap #1
Jest'e modül yollarını nasıl çözmesi gerektiğini moduleNameMapper seçeneğini yapılandırarak söyleyebilirsiniz, bu, module-alias gibi paketleri kullanıyorsanız veya mutlak yollar kullanıyorsanız faydalıdır. Bu satırları Jest yapılandırmanıza ekleyin:
{
// ...
"jest": {
// ...
"moduleNameMapper": {
"^src/(.*)$": "<rootDir>/$1"
}
}
}
Artık src/ ile başlayan modüller, varsayılan olarak src klasörü olan <rootDir>/ içinde aranacaktır (bu yukarıda birkaç satırda yapılandırılmıştır). Bu konuyla ilgili her şeyi yapabileceğiniz fikirler almak için yukarıdaki dokümantasyon bağlantısına göz atın.
Diğer yanıtın dediği gibi mutlak yollar kullanmakta neyin yanlış olduğunu bilmiyorum, bu sadece kullanışlı olmakla kalmaz, aynı zamanda hem NestJS hem de Angular'da gayet iyi çalışır.
Cevap #2
Uygulamanızda "src/article/article.entity" gibi yolları kullanmayın, bunlar derlemeden sonra mevcut olmayacaktır. Bunun yerine "../../article/article.entity" gibi göreli yollar kullanın (bu sadece tahmini bir yoldur)... Saygılar
Cevap #3
Göreceli İçe Aktarımlara Geçmek
Ve bunu otomatikleştirmek için VSCode ayarı.
TypeScript için VSCode import ayarlarımı göreli yolları kullanacak şekilde değiştirmem gerekiyordu. Varsayılan olarak, VSCode "en kısa" yol ile import ediyordu, bu da src/auth/user.entity gibi görünüyordu. NestJS uygulamam sorunsuz derleniyordu, ancak sizinle aynı Jest test hatalarını alıyordum.
Ayarı TypeScript › Preferences: Import Module Specifier relative olarak değiştirdikten sonra, modüller ../auth/user.entity şeklinde içe aktarılıyor. (Ayarı TypeScript için değiştirdiğinizden emin olun, çünkü JavaScript için de aynı ayar mevcut. İkisini de değiştirdim.).
Bu modül ithalat değişikliklerini yapmak, NestJS Jest test sorunlarımı düzeltti; benzer Cannot find module 'src/article/article.entity' from 'comment/comment.entity.ts' tarzı hatalarla karşılaştım.
VSCode typescript tercihlerinin değiştirilmesi hakkında daha fazla detay burada: https://stackoverflow.com/a/53137571/8177355
