0

I'm trying to create an api using dependency inversion concepts with inversify. In case I have a graphl resolver that uses a controller that comes from the inversify container, but when writing tests with jest I can't mock this controller, can anyone help me?

Controller:

import { inject, injectable } from "inversify";
import { User } from "./user.entitiy";
import { IUserService } from "./interface/IUser.service";
import { CreateUserDto } from "./interface/User.dto";

@injectable()
class UserController {

  constructor(@inject('IUserService') private readonly userService: IUserService) {}

  public async create(createUserDto: CreateUserDto): Promise<User> {
    return await this.userService.create(createUserDto);
  }

  public async update(createUserDto: CreateUserDto): Promise<User> {
    return await this.userService.update(createUserDto);
  }

  public async delete(userId: string): Promise<User> {
    return await this.userService.delete(userId);
  }

  public async findById(userId: string): Promise<User> {
    return await this.userService.findById(userId);
  }

  public async find(): Promise<User[]> {
    return await this.userService.find();
  }
}

export { UserController } 

Container:

import { Container } from 'inversify';
import { IUserService } from './interface/IUser.service';
import { UserService } from './user.service';
import { IUserRepository } from './interface/IUser.repository';
import { UserRepository } from './user.repository';
import { UserController } from './user.controller';
import { PrismaClient } from '@prisma/client';

const UserContainer = new Container();

UserContainer.bind<PrismaClient>('PrismaClient').toConstantValue(new PrismaClient());
UserContainer.bind<IUserRepository>('IUserRepository').to(UserRepository);
UserContainer.bind<IUserService>('IUserService').to(UserService);
UserContainer.bind<UserController>(UserController).toSelf();

export { UserContainer }

Resolver:

import { UserContainer } from "../user.container";
import { UserController } from "../user.controller";

let controller = UserContainer.resolve<UserController>(UserController);

const UserResolver = {
  Query: {
    findUser: (obj: any, args: any, context: any, info: any) => {
      return controller.findById(args.userId);
    },
    findUsers: (obj: any, args: any, context: any, info: any) => {
      return controller.find();
    }
  },
  Mutation: {
    createUser: (obj: any, args: any, context: any, info: any) => {
      return controller.create(args.input);
    },
    updateUser: (obj: any, args: any, context: any, info: any) => {
      return controller.update(args.input);
    },
    deleteUser: (obj: any, args: any, context: any, info: any) => {
      return controller.delete(args.userId);
    },
  }
}

export { UserResolver };

I tried to create the repository as a class and inject the controller with @inject to mock it at test time, but then the controller is always undefined.

Abner Matheus
  • 41
  • 1
  • 8

0 Answers0