node.js - 使用 Mongoose 的抽象类

标签 node.js mongodb unit-testing mongoose ecmascript-6

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

我的意思是,我想“模拟”一个接口(interface)行为,比如在我的具体类中创建一个契约。

实际上,在与用户打交道时,我有一个 UserMongoRepository 类并实现了契约(Contract):

  • getAll() 按 promise 返回完整的用户列表
  • 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 注入(inject)到我的构造函数中,并且能够模拟它。

对于 mongoose,这有点令人不安,因为完成这项工作的元素不是实例化对象(以便我可以模拟它),而是在文档顶部导入的类定义。

解决方案

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

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

let user = new this.MongooseUser({})

您有更好的想法,以数据映射器的方式抽象 Mongoose 行为吗?

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

最佳答案

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

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

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

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

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

关于node.js - 使用 Mongoose 的抽象类,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33820929/

相关文章:

java - java 中的 .isEqualTo 与 .equals

javascript - fs-path 似乎没有创建正确的文件/文件夹

javascript - 时刻JS ("Must to show days in next week")

ruby - 如何从 Mongoid 的嵌入文档中排除字段?

mongodb - 使用聚合合并两个单独集合的记录

unit-testing - 是否可以有条件地在 Lua 中加载库?

javascript - 插入很多在 mongoDB 中不起作用为什么?

node.js - 如何将 Helmet 实现到 Node 服务器中? [没有 express ]

mongodb - 在我的 Play2 应用程序中使用 Future 执行 getOrElse 时获取值映射不是对象的成员

javascript - 如何测试 axios 包装器