Proxyquire:不能存根Cassandra驱动程序

我试图嘲笑Cassandraunit testing用例,我使用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) } } 

但是这里不是创build模拟对象,而是通过Cassandra驱动程序创build连接到实际数据库的对象。

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

通过给DBServices提供一个构造DBServices并让调用者“注入”依赖关系,它应该允许更简单的testing:

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

现在你的testing可以构build存根,导入你的DBServices,并用这个存根创build一个新的DBservices ,并且锻炼DBServices并在你的存根上做出断言。

这现在需要调用者导入实际的生产卡桑德拉并打电话:

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

testing这些更高层次的调用者可能会发生在集成或系统testing中,因为DBServices已经通过了unit testing,所以您实际上可以使用真正的cassandra驱动程序。