我尝试在nestjs中运行测试文件,我想连接到测试数据库并使用它运行服务。我的服务未定义,service.findBuId也未定义。如何在测试文件上获取UserService实例?
user.service.ts
import { Injectable } from '@nestjs/common';
import { User } from './model/user.model';
import { InjectModel } from '@nestjs/sequelize';
@Injectable()
export class UserService {
constructor(
@InjectModel(User)
private userModel: typeof User,
) {}
async findById(id: number): Promise<User> {
return await this.userModel.findOne({
where: { id },
raw: true,
nest: true,
});
}
}
user.service.spec.ts
import { Test, TestingModule } from '@nestjs/testing';
import { UserService } from './user.service';
import { SequelizeModule } from '@nestjs/sequelize';
describe('UserService', () => {
let service: UserService;
beforeEach(async () => {
const module: TestingModule = await Test.createTestingModule({
imports: [
SequelizeModule.forRoot({
dialect: 'postgres',
host: 'localhost',
port: 5432,
username: 'postgres',
password: '@@@',
database: 'test',
}),
],
providers: [UserService],
}).compile();
service = module.get<UserService>(UserService);
});
it('should be defined', () => {
expect(service).toBeDefined();
});
it('should return id', async () => {
const user = await service.findById(1)
expect(user.id).toBeDefined();
});
});
答案 0 :(得分:0)
您的问题可能是relative path hell
的情况,是的,您已正确阅读。当您尝试实例化一个类(在这种情况下为UserService
)时会发生这种情况,但是它在User
的构造函数中具有依赖性。问题在于,由于User
导入中的相对路径,无法从user.service.spec.ts
文件所在的位置访问import { User } from './model/user.model';
。
您可以看一下这篇文章(我不是作者),其中介绍了不同的npm
库,这些库可能有助于解决here这个问题。
答案 1 :(得分:0)
首先,service
是undefined
,因为module.get
只能获取导出的提供程序。因此,您必须导出UserService
:
const module: TestingModule = await Test.createTestingModule({
imports: [
SequelizeModule.forRoot({
//...
}),
],
providers: [UserService],
exports: [UserService],
}).compile();
第二,Nestjs错误非常明显:
嵌套不能解析UserService(?,UserNavigationService)的依赖项。请确保在RootTestModule上下文中索引[0]处的参数UserRepository可用。
Nestjs告诉您在测试模块中找不到UserRepository
,并且无法初始化依赖于它的UserService
。您必须将存储库添加到测试模块:
const module: TestingModule = await Test.createTestingModule({
imports: [
SequelizeModule.forRoot({
//...
}),
// Make the User repository available in the module.
SequelizeModule.forFeature([User]),
],
//...
}).compile();