这是在节点中执行依赖注入的正确方法吗?

时间:2012-01-31 14:01:40

标签: javascript node.js dependency-injection vows sinon

我最近开始了一个节点项目,作为一个测试驱动的开发人员,我很快遇到了我的全新模块的依赖注入问题。 这是我如何弄清楚我应该做依赖注入。重要的是要注意我使用vows作为BDD框架并使用Sinon进行扩展。

我的模块:

exports.myMethod = function () {
  var crypto = exports.cryptoLib || require('ezcrypto').Crypto;
  crypto.HMAC(
    crypto.SHA256,
    'I want to encrypt this',
    'with this very tasty salt'
  );
};

我的测试:

var vows = require('vows'),
  sinon = require('sinon');

vows.describe('myObject').addBatch({
  'myMethod':{
    'topic':true,
    'calls ezcrypto.HMAC':function () {
      var myObject = require('../playground.js');
      var mock = sinon.mock(require('ezcrypto').Crypto);

      myObject.cryptoLib = mock;
      myObject.cryptoLib.HMAC = mock.expects("HMAC").once().withExactArgs(
        require('ezcrypto').Crypto.SHA256,
        'I want to encrypt this',
        'with this very tasty salt'
      );
      myObject.cryptoLib.SHA256 = require('ezcrypto').Crypto.SHA256;
      myObject.cryptoLib = mock;
      myObject.myMethod();
      mock.verify();
    }
  }
}).export(module);

你认为这是正确的方法吗?我喜欢这个解决方案,因为当你使用模块时它不需要更多(比如在require语句之后添加“()”)。

1 个答案:

答案 0 :(得分:3)

使用测试内容删除代码并不是一个好方法。代码的第2行

var crypto = exports.cryptoLib || require('ezcrypto').Crypto;

看起来像不必要的界面。我建议你用

替换它
var crypto = require('ezcrypto').Crypto;

更清洁。并且在测试中只是模拟'ezcrypto'模块的Crypto方法。请不要忘记在使用后将其还原。