Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/visual-studio-2008/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
用NestJS测试猫鼬模型_Nestjs - Fatal编程技术网

用NestJS测试猫鼬模型

用NestJS测试猫鼬模型,nestjs,Nestjs,我使用的是NestJS中的mongoose模块,所以我有我的模式和接口,在我的服务中,我使用@InjectModel来注入我的模型。我不知道如何模拟模型来注入到我的服务中 我的服务如下所示: @Injectable() 导出类身份验证服务{ 构造函数(@InjectModel('User')私有只读userModel:Model){} 异步createUser(dto:CreateUserDto):承诺{ const model=newthis.userModel(dto); model.act

我使用的是NestJS中的mongoose模块,所以我有我的模式和接口,在我的服务中,我使用@InjectModel来注入我的模型。我不知道如何模拟模型来注入到我的服务中

我的服务如下所示:

@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();