web-dev-qa-db-fra.com

Test des modèles de mangouste avec Nestjs

J'utilise le module de mangouste de Nestjs, donc j'ai mon schéma et une interface, et dans mon service, j'utilise @Injectmodel pour injecter mon modèle. Je ne réalise pas comment je peux se moquer du modèle à injecter dans mon service.

Mon service ressemble à ceci:

    @Injectable()
    export class AuthenticationService {

        constructor(@InjectModel('User') private readonly userModel: Model<User>) {}

        async createUser(dto: CreateUserDto): Promise<User> {
            const model = new this.userModel(dto);
            model.activationToken = this.buildActivationToken();
            return await model.save();
          }
    }

et dans mon test de service, j'ai ceci:

    const mockMongooseTokens = [
      {
        provide: getModelToken('User'),
        useValue: {},
      },
    ];

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

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

Mais quand je cours le test, j'ai eu cette erreur:

    TypeError: this.userModel is not a constructor

Je voudrais également obtenir mon modèle pour effectuer des tests unitaires sur celui-ci, comme indiqué dans cet article article

9
Jose Selesan

en réponse à la solution @JBH, un moyen de résoudre le problème de ne pas instancer la classe dans un appel d'une méthode comme findById() est d'utiliser des méthodes statiques, vous pouvez utiliser comme ça

class mockModel {

     constructor(public data?: any) {}

     save() {
         return this.data;
     }

     static findOne({ _id }) {
         return data;
     }
}

mockModel.findOne();

Plus d'infos sur les méthodes statiques: https://developer.mozilla.org/en-us/docs/web/javascript/reference/classes/static

1
add new before each:
describe('Create mockmodel', () => {


beforeEach(async () => {
    function mockUserModel(dto: any) {
      this.data = dto;
      this.save  = () => {
        return this.data;
      };
    }

    const module = await Test.createTestingModule({
        providers: [
          AuthenticationService,
          {
            provide: getModelToken('User'),
            useValue: mockUserModel,
          },
        ],
      }).compile();

    authenticationService = module.get<AuthenticationService>(AuthenticationService);
  });
})
0
Shailendra Singh