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
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
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);
});
})