1

我正在尝试为单元测试用例模拟 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 创建对象。

4

1 回答 1

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-driver,因为它们DBServices已经过单元测试。

于 2017-12-13T16:10:35.693 回答