Это правильный способ сделать Dependency Injection в Node? - PullRequest
4 голосов
/ 31 января 2012

Я недавно начал проект узла и, будучи разработчиком, управляемым тестами, быстро столкнулся с проблемой внедрения зависимостей с моим новым модулем.Вот как я понял, что должен делать инъекцию зависимостей.Важно отметить, что я использую обеты в качестве основы 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 Ответ

3 голосов
/ 20 марта 2012

Это не хороший способ испортить ваш код с помощью тестов.Строка 2 вашего кода

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

Похоже на ненужный интерфейс.Я предлагаю вам заменить его на

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

Гораздо чище.А в тесте просто смоделируйте криптографический метод модуля 'ezcrypto'.Только не забудьте вернуть его обратно после использования.

...