Proxyquire:不能Stub Cassandra-driver

时间:2017-12-12 16:54:06

标签: node.js unit-testing cassandra-3.0 proxyquire

我正在尝试模拟Cassandra的单元测试用例,我使用npm Cassandra-driver连接/查询cassandra。 对于模拟存根,这是我的代码。

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创建连接到实际DB的对象。

1 个答案:

答案 0 :(得分:0)

重构代码可能会让你删除cassandra-client并删除对proxyquire的依赖。

通过向DBServices提供构造函数并让调用者“注入”它应该允许更容易测试的依赖:

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

现在你的测试可以构建存根,导入你的DBServices并用存根创建一个新的DBservices,并运行DBServices并在你的存根上做出断言!

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

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

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