用NestJS测试猫鼬模型
我使用的是NestJS中的mongoose模块,所以我有我的模式和接口,在我的服务中,我使用@InjectModel来注入我的模型。我不知道如何模拟模型来注入到我的服务中 我的服务如下所示:用NestJS测试猫鼬模型,nestjs,Nestjs,我使用的是NestJS中的mongoose模块,所以我有我的模式和接口,在我的服务中,我使用@InjectModel来注入我的模型。我不知道如何模拟模型来注入到我的服务中 我的服务如下所示: @Injectable() 导出类身份验证服务{ 构造函数(@InjectModel('User')私有只读userModel:Model){} 异步createUser(dto:CreateUserDto):承诺{ const model=newthis.userModel(dto); model.act
@Injectable()
导出类身份验证服务{
构造函数(@InjectModel('User')私有只读userModel:Model){}
异步createUser(dto:CreateUserDto):承诺{
const model=newthis.userModel(dto);
model.activationToken=this.buildActivationToken();
return wait model.save();
}
}
在我的服务测试中,我有:
const mockMongooseTokens=[
{
提供:getModelToken(“用户”),
useValue:{},
},
];
beforeach(异步()=>{
常量模块:TestingModule=等待测试。createTestingModule({
供应商:[
…仿猫鼬,
认证服务,
],
}).compile();
服务=模块。了解mongoose模型
您得到的错误消息非常明确:this.userModel
确实不是构造函数,因为您为useValue
提供了一个空对象。为了确保有效注入,useValue
必须是mongoose.Model
的子类。mongoose本身对底层概念给出了一致的解释(来自第63行):
换句话说,mongoose模型是一个包含多个方法的类,这些方法试图连接到数据库。在我们的例子中,唯一使用的模型方法是save()
。mongoose使用javascript构造函数语法,同样的语法可以用于编写我们的模拟
太长,读不下去了
mock应该是一个构造函数,带有save()
param
写模拟
服务测试如下所示:
beforeach(异步()=>{
函数mockUserModel(dto:any){
这个.data=dto;
this.save=()=>{
返回此.data;
};
}
const module=await Test.createTestingModule({
供应商:[
认证服务,
{
提供:getModelToken(“用户”),
useValue:mockUserModel,
},
],
}).compile();
authenticationService=module.get.响应@jbh solution,解决在调用类似findById()的方法时不实例化类的问题的一种方法是使用静态方法,您可以这样使用
class mockModel {
constructor(public data?: any) {}
save() {
return this.data;
}
static findOne({ _id }) {
return data;
}
}
mockModel.findOne();
关于静态方法的更多信息:我知道这篇文章比较老,但是如果将来有人再问这个问题,这里是一个如何设置模拟模型并监视任何底层查询调用方法的示例。我花了比我想弄明白的更长的时间,但这里是一个完整的示例测试,不需要任何额外的工厂测试什么的
从'@nestjs/testing'导入{Test,TestingModule};
从'@nestjs/mongoose'导入{getModelToken};
从“猫鼬”导入{Model};
//User是我的类,UserDocument是我的类型脚本
//即:导出类型UserDocument=用户和文档{
让mockUserModel:Model;
让mockRepository:UsersRepository;
之前(异步()=>{
常量模块:TestingModule=等待测试。createTestingModule({
供应商:[
{
提供:getModelToken(User.name),
useValue:Model//{
expect(mockRepository.toBeDefined();
});
它('应返回用户文档',异步()=>{
//安排
const user=新用户();
const userID='12345';
康斯特间谍=开玩笑
.spyOn(mockUserModel,'findById')//我在这里找到了Kim Kern的解决方案,可以很好地做到这一点:我可以使用module.get这样访问userModel:userModel=wait module.get(getModelToken('User'));然后我可以使用不同的解析/拒绝值将save方法模拟为jest.fn函数。
* In Mongoose, the term "Model" refers to subclasses of the `mongoose.Model`
* class. You should not use the `mongoose.Model` class directly. The
* [`mongoose.model()`](./api.html#mongoose_Mongoose-model) and
* [`connection.model()`](./api.html#connection_Connection-model) functions
* create subclasses of `mongoose.Model` as shown below.
class mockModel {
constructor(public data?: any) {}
save() {
return this.data;
}
static findOne({ _id }) {
return data;
}
}
mockModel.findOne();