node.js - Proxyquire:无法 stub Cassandra 驱动程序

标签 node.js unit-testing cassandra proxyquire

我正在尝试模拟 Cassandra 的单元测试用例,我正在使用 npm Cassandra-driver 来连接/查询 cassandra。 为了模拟 stub ,这是我的代码。

beforeEach(function () {
        let CassandraClient = sinon.stub();
    CassandraClient.prototype.execute = sinon.stub().returns(new Promise((fulfill, reject) => {
        console.log("Inside execute method");
        fulfill(cassndaraExperimentQueryData);
    }));
    const CassandraClientWrapper = proxyquire('../../../../api/services/index.js', { 'cassandra-driver': { Client: CassandraClient } });
    console.log(typeof CassandraClientWrapper);
    CassandraClientWrapper.init();
    });

这就是我的index.js 的样子

   const cassandra = require('cassandra-driver');
    module.exports = class DBServices {
    init(){
    const contactPoint = process.env['cassndraIP'] || '127.0.0.1';
    var casssandraClient = new cassandra.Client({
              contactPoints: [contactPoint]
            });
let persistentObject  = new persistent(redisMockClient, casssandraClient)
    }
    }

但这里不是创建模拟对象,而是从连接到实际数据库的 Cassandra-driver 创建对象。

最佳答案

重组代码可能允许您删除 cassandra-client 并删除对 proxyquire 的依赖。

通过向DBServices提供构造函数并让调用者“注入(inject)”依赖项,它应该可以更轻松地进行测试:

    module.exports = class DBServices {
    constructor(cassandra) {
       this.cassandra = cassandra;
    }

    init(){
      const contactPoint = process.env['cassndraIP'] || '127.0.0.1';
      var casssandraClient = new this.cassandra.Client({
        contactPoints: [contactPoint]
      });
      let persistentObject  = new persistent(redisMockClient, casssandraClient)
      }
    }

现在您的测试可以构建 stub ,导入 DBService 并使用该 stub 创建一个新的 DBservices,然后使用 DBService 并对您的 stub 进行断言!

现在要求调用者导入实际的生产 cassandra 并对其进行调用:

const cassandra = require('cassandra-driver');
let db = new DBServices(cassandra);
db.init()

如果您实际上可以使用真正的 cassandra 驱动程序,则可以在集成或系统测试中测试这些更高级别的调用者,因为 DBServices 已经经过单元测试。

关于node.js - Proxyquire:无法 stub Cassandra 驱动程序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47777758/

相关文章:

node.js - Nodejs 和 phantomjs 或任何其他 headless 浏览器之间的实时通信

javascript - 在没有 TypeScript 的情况下调用不带 `.then()` 或 `await` 的异步函数的 Lint 警告

node.js - 我可以在koa中使用 'res'对象吗?

c# - 如果一次运行一个单元测试,则单元测试通过良好,如果运行 "All Tests in Solution",则 FileLoadException

ios - XCTest 与核心数据

python - 如何为 Cassandra 创建只读模型

javascript - Meteor 的帐户-ui-bootstrap-3 {{loginButtons}} 未显示

c# - NUnit测试调试

cassandra - 无法编辑cassandra用户密码

cassandra - Spring 数据 Cassandra 2.0 Select BLOB 列返回不正确的 ByteBuffer 数据