用mongoose抽象类

我正在开发一个我需要抽象的应用程序。

我的意思是说,我想“模拟”一个界面行为,比如在我的具体类中创build一个契约。

其实,处理用户,我有一个UserMongoRepository类与合同执行:

  • getAll()通过promise返回用户的完整列表
  • getById(id)返回promise所关心的用户
  • 保存(用户)保存用户的承诺
  • …等

我在UserMysqlRepository内部实现了相同的方法(当需要更改时允许我切换行为。

问题

我的问题是,我正在处理的Mongoose不像数据映射器,但更像是一个活跃的logging。

这意味着我的保存(用户)的实现将有点奇怪,如下所示:

save(user){ let mongooseUser = this.convert(user); return user.save(); } 

convert方法允许我从标准模型切换到特定的Mongoose模型。 它允许我再次抽象一些,不必重写我的完整的应用程序数据访问。

我真正的问题是当我尝试unit testing我的全class时:

 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的情况下,这有点令人不安,因为作业的元素不是一个实例化的对象(所以我可以嘲笑它),而是在文档的顶部导入一个类定义。

解决scheme

我应该将MongooseUser类的定义作为parameter passing给构造函数吗?

暗示我将这个代码放在convert方法中:

 let user = new this.MongooseUser({}) 

你有没有更好的主意,以数据映射器的方式来抽象mongoose行为?

我不想用另一个模块,在我的意义上说,它是最先进的NodeJS模块。

我不熟悉import语法(也EMCASCRIPT-6 ),虽然你说你正在使用node.js ,所以我build议使用proxquire包。 这个想法是,软件包允许你需要一个外部软件包,同时保留软件包要使用的要求。 所以在你的情况下,你可以做一些事情:

 proxyquire('../my/class/that/uses/mongoose', { mongoose: MyTestMongooseImplementation }) 

这将允许你使用你自己的mongoose执行,同时仍然使用你的MongooseUser因为你已经在你的包中定义它。 或者,您可以重写MongooseUser类(相对于要求存档的文件的path:

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

文档: https : //www.npmjs.com/package/proxyquire