使用猫鼬抽象类

mfr*_*het 7 unit-testing mongoose mongodb node.js ecmascript-6

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

我的意思是,我想"模拟"一个界面行为,比如在我的具体类中创建一个契约.

实际上,在处理用户时,我有一个UserMongoRepository类,并且实现了合同:

  • getAll()按promise返回完整的用户列表
  • getById(id)返回promise所关注的用户
  • save(用户)按承诺保存用户
  • ......等

我在UserMysqlRepository中实现了相同的方法(允许我在需要更改时切换行为.

问题

我的问题是我正在处理Mongoose,它不像数据映射器,但更像是一个活动记录.

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

save(user){
    let mongooseUser = this.convert(user);
    return user.save();
  }
Run Code Online (Sandbox Code Playgroud)

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();
  }

}
Run Code Online (Sandbox Code Playgroud)

以标准的方式,我会在我的构造函数中注入我的DAO,并能够模拟它.

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

解决方案

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

暗示我将在convert方法中包含此代码:

let user = new this.MongooseUser({})
Run Code Online (Sandbox Code Playgroud)

您是否有更好的想法,以数据映射方式抽象猫鼬行为?

我不想使用另一个模块,在我看来,它是NodeJS中最先进的模块......

For*_*ord 0

我不熟悉import语法(也不熟悉EMCASCRIPT-6),尽管你说你正在使用node.js,所以我建议使用该proxquire包。这个想法是,包允许您需要外部包,同时存根该包将使用的需求。因此,就您的情况而言,您可以执行以下操作:

proxyquire('../my/class/that/uses/mongoose', {
    mongoose: MyTestMongooseImplementation
})
Run Code Online (Sandbox Code Playgroud)

这将允许您使用自己的mongoose实现,同时仍然使用您MongooseUser在包中定义的实现。或者,您可以只覆盖类MongooseUser(相对于您正在存根其要求的文件的路径:

proxyquire('/path/to/UserMongooseRepository', {
    '../../auth/mongooseModel/MongooseUser': MyTestMongooseUser
})
Run Code Online (Sandbox Code Playgroud)

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