【问题标题】:I can`t run my tests on test DB, service is undefined我无法在测试数据库上运行测试,服务未定义
【发布时间】:2020-12-16 23:17:29
【问题描述】:

我尝试在 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();
  });
});

【问题讨论】:

    标签: typescript jestjs nestjs


    【解决方案1】:

    您的问题可能是relative path hell 的情况,是的,您没看错。当您尝试实例化一个类时会发生这种情况,在本例中为UserService,但它在User 的构造函数中具有依赖关系。问题是由于import { User } from './model/user.model'; 导入中的相对路径,可能无法从您的user.service.spec.ts 文件所在的位置访问User

    您可以查看这篇文章(我不是作者),其中解释了可能有助于解决此问题 here 的不同 npm 库。

    【讨论】:

    • 感谢您的快速回答,但是,我确信我的路径一切正常。接下来是我的错误:“Nest 无法解析 UserService (?, UserNavigationService) 的依赖关系。请确保索引 [0] 处的参数 UserRepository 在 RootTestModule 上下文中可用。”
    【解决方案2】:

    首先,serviceundefined,因为module.get 只能获取导出的提供程序。所以你要导出UserService:

    const module: TestingModule = await Test.createTestingModule({
      imports: [
        SequelizeModule.forRoot({
          //...
        }),
      ],
      providers: [UserService],
      exports: [UserService],
    }).compile();
    

    第二,Nestjs的错误非常明确:

    Nest 无法解析 UserService (?, UserNavigationService) 的依赖关系。请确保索引 [0] 处的参数 UserRepository 在 RootTestModule 上下文中可用。

    Nestjs 告诉你在测试模块中找不到UserRepository 并且依赖它的UserService 无法初始化。您必须将存储库添加到测试模块:

    const module: TestingModule = await Test.createTestingModule({
      imports: [
        SequelizeModule.forRoot({
          //...
        }),
        // Make the User repository available in the module.
        SequelizeModule.forFeature([User]),
      ],
      //...
    }).compile();
    

    【讨论】:

    • 谢谢,现在定义了服务,但我现在有新错误:模型未初始化:无法调用成员“findOne”。 “用户”需要添加到 Sequelize 实例中。
    猜你喜欢
    • 2020-07-02
    • 1970-01-01
    • 2019-01-05
    • 1970-01-01
    • 2016-05-17
    • 1970-01-01
    • 2017-11-10
    • 2023-01-10
    • 2021-09-02
    相关资源
    最近更新 更多