我正在开发一个我需要抽象的应用程序。
我的意思是,我希望“模拟”一个界面行为,比如在我的具体类中创建一个契约。
实际上,在处理用户时,我有一个UserMongoRepository类,并且已经实现了合同:
我在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类定义作为构造函数内的参数传递吗?
暗示我将在convert方法中包含此代码:
let user = new this.MongooseUser({})
您是否有更好的想法,以数据映射方式抽象猫鼬行为?
我不想使用另一个模块,就我而言,它是NodeJS中最先进的模块...