模拟存储库,然后在Node.js中交换实际实现

时间:2015-09-06 23:54:54

标签: node.js mocking

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

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

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

由于没有接口的概念,那么wtf你在Node / JS中做什么?我必须在存储库下面创建一个数据层(无论它是一组自定义模块,对Postgres进行真正的查询调用,还是我使用的是Mongoose或者它可能是什么,我需要一组存储库调用的DL模块这是真正的DB调用。)

让我说我确实选择使用像Sinon.js这样的框架,你正在模拟的模块的通用接口是什么,可以由模拟框架和真实模块共享?

1 个答案:

答案 0 :(得分:0)

有多种方法可以做到这一点。如果你来自不同的背景,可能需要一些人习惯Node。

你可以这样做:

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

  this.myQuery = function(n, cb) {
    this.db.query(n, cb);
  }
}

然后在config.js

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

然后

var config = require('./config.js');
var db = require('./db')(config.db);

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

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

由于确实没有类型检查,人们通常会在运行时验证它们的测试。如果你真的在做TDD,它可能不会产生很大的不同。