javascript - 这是在 Node 中进行依赖注入(inject)的正确方法吗?

标签 javascript node.js dependency-injection vows sinon

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

最佳答案

用测试 Material 来破坏你的代码可不是什么好办法。您的代码的第 2 行

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

看起来像是不必要的界面。我建议您将其替换为

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

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

关于javascript - 这是在 Node 中进行依赖注入(inject)的正确方法吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9080798/

相关文章:

dependency-injection - Symfony 4 服务注入(inject)参数太少

javascript - 使用 jquery 切换 css

javascript - 在 ES6 中导出/导入内置对象的自定义函数?

javascript - 用于获取用户输入并将其传递给批处理文件的 GUI

node.js - 使用 mongoose 显示 cloudinary 上传的图像

node.js - Node GeoFire 内存泄漏?

javascript - 获取类中的全局变量

javascript - 使用 NodeJS 解析 HTML 文件

python - Python 中的依赖注入(inject)容器是否有意义?

c# - 带 MVVM + WPF 的纯 DI