Node.js 利用mongoose抽象类
我正在开发一个应用程序,我需要在其中进行一些抽象 我的意思是,我想“模拟”一个接口行为,比如在我的具体类中创建一个契约 实际上,与用户打交道时,我有一个UserMongoRepository类,它实现了契约: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中实现了相同的方法(允许我在需要更改时切换行为) 问题 我的问题是,我处理的猫鼬不像数据映射器,更像是活动记
- getAll()按承诺返回用户的完整列表
- getById(id)返回与promise相关的用户
- 保存(用户)通过承诺保存用户
- 。。。等
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,但我很快会给您答复;)