将依赖项附加到类是否适合测试?

时间:2014-11-07 22:13:30

标签: javascript node.js tdd bdd

我正在努力转移到TDD / BDD。我有多种方法依赖外部模块的响应来履行其职责。我想在不同的情况下测试这些方法,例如,如果模块响应数据对象或错误。

这样做的一种方法是将外部模块作为属性附加到正在测试的类/模块,然后将其“存根”。这看起来有点脏,因为你最终会将所有这些其他模块附加到你的模块上。

这是一种测试依赖外部模块响应的方法的合适方法,还是有更好的方法?

我是否应该以某种方式重构我的架构以使其更容易测试?如果是这样的话?

这是我的意思的一个例子:

我-module.js

var extMod = require('external-module');

var myMod = module.exports = function () {

  /* Do Stuff */

};
myMod.prototype.extMod = extMod;

myMod.prototype.someMethod = function () {

  this.extMod({ /* request */ }, function () {
    /* Do Stuff */
  });

};

myModuleSpec.js

我在这个例子中使用了Mocha,Chai和Sinon

var chai       = require('chai');
var expect     = chai.expect;
var sinon      = require('sinon');
var sinonChai  = require('sinon-chai');

var myMod = require('../lib/my-module.js');

chai.use(sinonChai);

describe('My Module', function () {

  /* Some Tests */

  describe('.someMethod()', function () {

    it('should do something when a data object is returned', function () {

      var foo  = new myMod();
      var stub = sinon.stub(foo, 'extMod').returns({ id: 1, name: 'Some Name' });
      var result = foo.someMethod();

      expect(result).to.be.true;

    });

    it('should do something when an error is returned', function () {

      var foo  = new myMod();
      var err = new Error('Something terrible happened.');
      var stub = sinon.stub(foo, 'extMod').returns(err);
      var result = foo.someMethod();

      expect(result).to.be.false;

    });

  });
});

替代

我还考虑创建一个方法,只返回传递给它的任何内容,然后运行外部方法以允许存根而不实际将外部模块附加到类。这里唯一的问题是你只能存根一个外部方法,这可能是可行的。

像这样:

var extMod = require('external-module');

var myMod = module.exports = function () {

  /* Do Stuff */

};
myMod.prototype.extMod = function (module) {
  return module;
};

myMod.prototype.someMethod = function () {

  var extModule = this.extMod(extMod);
  extModule({ /* request */ }, function () {
    /* Do Stuff */
  });

};

0 个答案:

没有答案