Nestjs 无法解析服务规范中的依赖关系

问题描述 投票:0回答:1

我尝试编写一个 Nestjs 项目,只在 mongodb 中保存一些对象,但是运行测试规范(users.service 和 users.controller),我得到这个神秘的错误:

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

Potential solutions:
- Is RootTestModule a valid NestJS module?
- If "UserModel" is a provider, is it part of the current RootTestModule?
- If "UserModel" is exported from a separate @Module, is that module imported within RootTestModule?
  @Module({
    imports: [ /* the Module containing "UserModel" */ ]
  })

   6 |
   7 |   beforeEach(async () => {
>  8 |     const module: TestingModule = await Test.createTestingModule({
     |                                   ^
   9 |       providers: [UsersService],
  10 |     }).compile();
  11 |

我有一个根应用程序模块,用于导入和设置猫鼬和用户模块。应用程序控制器有

/
端点,它只返回状态消息。应用程序控制器的测试有效。我收到用户服务和用户控制器规格的上述错误。 这是用户服务规范的示例

import { Test, TestingModule } from '@nestjs/testing';
import { UsersService } from './users.service';

describe('UsersService', () => {
  let service: UsersService;

  beforeEach(async () => {
    const module: TestingModule = await Test.createTestingModule({
      providers: [UsersService],
    }).compile();

    service = module.get<UsersService>(UsersService);
  });

  it('should be defined', () => {
    expect(service).toBeDefined();
  });
});

用户控制器有 2 个端点来创建和获取新用户。 这是用户模块:

import { Module } from '@nestjs/common';
import { UsersController } from './users.controller';
import { UsersService } from './users.service';
import { MongooseModule } from '@nestjs/mongoose';
import { User, UserSchema } from './schemas/user.schema';

@Module({
  imports: [
    MongooseModule.forFeature([{ name: User.name, schema: UserSchema }]),
  ],
  controllers: [UsersController],
  providers: [UsersService],
})
export class UsersModule {}

其次是用户服务:

import { Injectable } from '@nestjs/common';
import { InjectModel } from '@nestjs/mongoose';
import { User } from './schemas/user.schema';
import { Model } from 'mongoose';
import { CreateUserDto } from './dto/create-user.dto';

@Injectable()
export class UsersService {
  constructor(@InjectModel(User.name) private userModel: Model<User>) {}

  async create(createUserDto: CreateUserDto): Promise<User> {
    const user = new this.userModel(createUserDto);
    return user.save();
  }

  async findById(id: string): Promise<User> {
    return this.userModel.findById(id).exec();
  }
}

这是用户控制器

import { Body, Controller, Get, Param, Post } from '@nestjs/common';
import { UsersService } from './users.service';
import { CreateUserDto } from './dto/create-user.dto';
import { User } from './schemas/user.schema';

@Controller('users')
export class UsersController {
  constructor(private usersService: UsersService) {}

  @Post()
  async create(@Body() createUserDto: CreateUserDto) {
    await this.usersService.create(createUserDto);
  }

  @Get(':id')
  async findById(@Param('id') id: string): Promise<User> {
    return this.usersService.findById(id);
  }
}

问题在于规范是如何编写的。我对依赖注入框架很陌生,因此非常感谢您在理解和解决这个问题方面的帮助。

unit-testing jestjs nestjs
1个回答
0
投票

您需要添加

UsersService
的依赖项的模拟,在本例中,是一个与
@InjectModel(User.name)
的注入令牌匹配的自定义提供程序。幸运的是,
@nestjs/mongoose
有一个辅助方法来创建此令牌,因此您只需将模拟实例添加到测试模块的
providers
数组中,就可以开始了。

import { getModelToken } from '@nestjs/mongoose';
import { Test, TestingModule } from '@nestjs/testing';
import { User } from './schemas/user.schema';
import { UsersService } from './users.service';

describe('UsersService', () => {
  let service: UsersService;

  beforeEach(async () => {
    const module: TestingModule = await Test.createTestingModule({
      providers: [
        UsersService,
        {
          provide: getModelToken(User.name),
          useValue: {
            findById: () => ({
              exec: jest.fn().mockResolvedValue(someMockUserObject)
            })
          }
        }
      ],
    }).compile();

    service = module.get<UsersService>(UsersService);
  });

  it('should be defined', () => {
    expect(service).toBeDefined();
  });
});

您可以在这个社区维护的测试示例存储库中看到更深入的示例

© www.soinside.com 2019 - 2024. All rights reserved.