模拟存储库,然后在Node.js中替换为真正的实现

模拟存储库,然后在Node.js中替换为真正的实现,node.js,mocking,Node.js,Mocking,我正在为上面的抽象构建一个具有更高级别API的存储库层,以调用数据库持久性。但是,既然JavaScript没有像C#或Java这样的语言那样的接口概念,那么如何将模拟替换为真正的实现呢 与Sinon.js或类似的东西相比,我更喜欢创建自定义模拟、节点存储库模块,其中包含数据持久性高级方法 如果我正在创建节点模块,那么如何创建?我可以发送存储库的模拟表示,模拟存储库方法正在做什么,但是使用这些存储库模块的实际节点模块需要使用调用真实数据库的真实存储库实现。如何在节点中完成此操作?我只想通过一个属性

我正在为上面的抽象构建一个具有更高级别API的存储库层,以调用数据库持久性。但是,既然JavaScript没有像C#或Java这样的语言那样的接口概念,那么如何将模拟替换为真正的实现呢

与Sinon.js或类似的东西相比,我更喜欢创建自定义模拟、节点存储库模块,其中包含数据持久性高级方法

如果我正在创建节点模块,那么如何创建?我可以发送存储库的模拟表示,模拟存储库方法正在做什么,但是使用这些存储库模块的实际节点模块需要使用调用真实数据库的真实存储库实现。如何在节点中完成此操作?我只想通过一个属性进行注入,我也不想要一些巨大的注入框架

既然没有接口的概念,那么您在Node/JS中会使用wtf吗?我必须在存储库下面创建一个数据层(无论是对Postgres进行真正查询调用的自定义模块集,还是使用Mongoose,或者其他什么,我都需要存储库调用的DL模块集,以便在后台调用真正的DB)


假设我选择使用一些框架,比如Sinon.js,你正在模拟的模块的通用接口是什么,可以由模拟框架和真实模块共享?

有多种方法。如果你来自不同的背景,可能需要一些时间来适应这个节点

您可以这样做:

module.exports = function(db) {
  this.db = db;

  this.myQuery = function(n, cb) {
    this.db.query(n, cb);
  }
}
然后在
config.js中

var exports.db = require('./mydb');
然后

有很多可能的变化。您可以基于字符串或其他内容在某处执行动态
require
。或者使用类或init函数。大多数人最终可能会变得相似

proxyrequire
模块可能会有所帮助。Sinon.js也可以


由于实际上没有类型检查,人们通常在运行时通过测试来验证这一点。如果你真的在做TDD,可能不会有太大的区别。

那么“this”设置对象的prototype属性呢?
var config = require('./config.js');
var db = require('./db')(config.db);