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.