我无法在测试数据库上运行测试,服务未定义

时间:2020-08-28 02:42:36

标签: typescript jestjs nestjs

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

2 个答案:

答案 0 :(得分:0)

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

您可以看一下这篇文章(我不是作者),其中介绍了不同的npm库,这些库可能有助于解决here这个问题。

答案 1 :(得分:0)

首先,serviceundefined,因为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();