【问题标题】:Is this the correct way to do Dependency Injection in Node?这是在 Node 中进行依赖注入的正确方法吗?
【发布时间】:2012-02-23 05:54:38
【问题描述】:

我最近开始了一个节点项目,作为一名测试驱动开发人员,我很快就遇到了我全新模块的依赖注入问题。 以下是我认为我应该进行依赖注入的方法。请务必注意,我使用 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 语句后添加“()”)。

【问题讨论】:

  • 你还没说是什么问题。
  • 问题是我不确定这是正确的方法。寻找验证我并没有在这里做一些根本上有缺陷的事情。
  • 至少测试通过了。更多的是关于代码设计,我想知道它是否符合犹太教规。
  • 没有什么是真的,一切都是允许的。

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


【解决方案1】:

用测试的东西来破坏你的代码并不是一个好方法。代码的第 2 行

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

看起来像不必要的界面。建议换成

var crypto = require('ezcrypto').Crypto;

干净多了。并且在测试中只是模拟“ezcrypto”模块的加密方法。只是不要忘记在使用后将其还原。

【讨论】:

  • 你能告诉我我应该模拟 Crypto 并在测试期间将模拟注入我的模块吗?
  • 这很简单:var oldCrypto = require('ezcrypto').Crypto; require('ezcrypto').Crypto = MyCrypto; // mock // do tests
  • require() 保证它返回了一个记忆的结果,这就是实现这一点的原因
  • 我对此仍有复杂的感受。并不是说它不起作用,而是使用全局域来注入依赖项(不仅用于测试 BTW)让我感到不舒服。特别是知道测试套件异步运行测试。我想知道其他测试是否不会被全局覆盖的对象搞砸。
  • 我认为并行运行测试不是一个好主意。但是当顺序运行时,覆盖整个模块是没有问题的。它甚至比使用纯测试接口丢弃你的代码更好。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2016-09-15
  • 1970-01-01
  • 2017-07-22
  • 1970-01-01
  • 1970-01-01
  • 2019-02-25
  • 1970-01-01
相关资源
最近更新 更多