使用猫鼬的抽象类
Posted
技术标签:
【中文标题】使用猫鼬的抽象类【英文标题】:Abstracting class using mongoose 【发布时间】:2016-02-22 14:25:46 【问题描述】:我正在开发一个需要一些抽象的应用程序。
我的意思是,我想“模拟”一个接口行为,比如在我的具体类中创建一个契约。
实际上,在与用户打交道时,我有一个 UserMongoRepository 类并实现了合同:
getAll() 按承诺返回完整的用户列表 getById(id) 通过 promise 返回关注的用户 save(user) 通过 promise 保存用户 ...等我在 UsermysqlRepository 内部实现了相同的方法(允许我在需要更改时切换行为。
问题
我的问题是我正在处理的 Mongoose 不像数据映射器,而更像是一个活动记录。
这意味着我的 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 类定义作为参数传递给构造函数吗?
暗示我将在转换方法中包含此代码:
let user = new this.MongooseUser()
您有更好的想法,以数据映射器的方式抽象猫鼬行为吗?
我不想使用其他模块,在我看来,它是 NodeJS 中最先进的模块...
【问题讨论】:
澄清一下,您使用的是猫鼬对吗? 现在,我正在使用它,是的 我得去atm,但我很快就会给你答复;) 【参考方案1】:我不熟悉import
语法(也不熟悉EMCASCRIPT-6
),尽管你说你使用的是node.js
,所以我建议使用proxquire
包。这个想法是,该包允许您要求一个外部包,同时存根该包将使用的要求。因此,在您的情况下,您可以执行以下操作:
proxyquire('../my/class/that/uses/mongoose',
mongoose: MyTestMongooseImplementation
)
这将允许您使用自己的 mongoose
实现,同时仍然使用您在包中定义的 MongooseUser
。或者,您可以只覆盖 MongooseUser
类(相对于您要存根的文件的路径:
proxyquire('/path/to/UserMongooseRepository',
'../../auth/mongooseModel/MongooseUser': MyTestMongooseUser
)
文档:https://www.npmjs.com/package/proxyquire
【讨论】:
以上是关于使用猫鼬的抽象类的主要内容,如果未能解决你的问题,请参考以下文章