Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/mongodb/11.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
Node.js 利用mongoose抽象类_Node.js_Mongodb_Unit Testing_Mongoose_Ecmascript 6 - Fatal编程技术网

Node.js 利用mongoose抽象类

Node.js 利用mongoose抽象类,node.js,mongodb,unit-testing,mongoose,ecmascript-6,Node.js,Mongodb,Unit Testing,Mongoose,Ecmascript 6,我正在开发一个应用程序,我需要在其中进行一些抽象 我的意思是,我想“模拟”一个接口行为,比如在我的具体类中创建一个契约 实际上,与用户打交道时,我有一个UserMongoRepository类,它实现了契约: getAll()按承诺返回用户的完整列表 getById(id)返回与promise相关的用户 保存(用户)通过承诺保存用户 。。。等 我在UserMysqlRepository中实现了相同的方法(允许我在需要更改时切换行为) 问题 我的问题是,我处理的猫鼬不像数据映射器,更像是活动记

我正在开发一个应用程序,我需要在其中进行一些抽象

我的意思是,我想“模拟”一个接口行为,比如在我的具体类中创建一个契约

实际上,与用户打交道时,我有一个UserMongoRepository类,它实现了契约:

  • getAll()按承诺返回用户的完整列表
  • getById(id)返回与promise相关的用户
  • 保存(用户)通过承诺保存用户
  • 。。。等
我在UserMysqlRepository中实现了相同的方法(允许我在需要更改时切换行为)

问题

我的问题是,我处理的猫鼬不像数据映射器,更像是活动记录

这意味着我的save(user)实现有点奇怪,如下所示:

save(user){
    let mongooseUser = this.convert(user);
    return user.save();
  }
convert方法允许我从标准模型切换到特定的Mongoose模型。它同样允许我进行一些抽象,而不必重写我的完整应用程序数据访问

我真正的问题是,当我尝试对整个类进行单元测试时:

import MongooseUser from '../../auth/mongooseModel/MongooseUser';
/**
* UserMongoRepositoryclass
*/
export default class UserMongoRepository{

  /**
  * Create an UserMongoRepository
  */
  constructor(){

  }

  /**
  * Convert a User to a MongooseUser
  */
  convert(user){
    return new MongooseUser({email:user.mail,password:user.password,firstname:user.firstName, lastname:user.lastName});
  }

  findById(id){
    return MongooseUser.find({id:id});
  }

  save(user){
    return user.save();
  }

}
以一种标准的方式,我将把我的DAO注入到我的构造函数中,并能够模拟它

在mongoose的例子中,这有点令人不安,因为生成作业的元素不是实例化的对象(因此我可以模拟它),而是在文档顶部导入的类定义

解决方案

我应该将MongooseUser类定义作为构造函数中的参数传递吗

这意味着我将在convert方法中包含以下代码:

let user = new this.MongooseUser({})
你有没有更好的主意,用数据映射器的方式来抽象猫鼬的行为


我不想使用另一个模块,在我看来,它是NodeJS中最高级的一个…

我不熟悉
导入
语法(也不熟悉
EMCASCRIPT-6
),尽管您说您使用的是
node.js
,但我还是建议您使用该软件包。该软件包允许您需要一个外部软件包,同时保留该软件包将使用的需求。因此,在您的情况下,您可以执行以下操作:

proxyquire('../my/class/that/uses/mongoose', {
    mongoose: MyTestMongooseImplementation
})
这将允许您使用自己的
mongoose
实现,同时仍使用您在包中定义的
MongooseUser
。或者,您可以只覆盖
MongooseUser
类(相对于您正在存根其要求的文件的路径:

proxyquire('/path/to/UserMongooseRepository', {
    '../../auth/mongooseModel/MongooseUser': MyTestMongooseUser
})

文档:

为了澄清,您使用的是猫鼬,对吗?目前,我正在使用它,是的,我必须使用atm,但我很快会给您答复;)