Насмешка над зависимостью в Node - PullRequest
4 голосов
/ 01 марта 2012

Я нахожусь в процессе изучения Node.js и мне интересно, как люди высмеивают зависимости в своих модулях при модульном тестировании.

Например: у меня есть модуль, который абстрагирует мои вызовы MongoDB.Модуль, использующий этот модуль, может начать что-то вроде этого.

var myMongo = require("MyMongoModule");
// insert rest of the module here.

Я хочу убедиться, что я тестирую такой модуль изолированно, а также, чтобы мои тесты не вставляли записи / документы в Mongo.

Есть ли модуль / пакет, в котором я могу использовать прокси require(), чтобы я мог внедрить его в мои собственные макеты?Как другие обычно решают эту проблему?

Ответы [ 4 ]

1 голос
/ 01 марта 2012

Вы можете использовать библиотеку внедрения зависимостей, например nCore

Честно говоря, самая сложная часть этого процесса - макетирование API mongoDB, которое является сложным и нетривиальным. По моим оценкам, на макетирование большей части используемого мной API-интерфейса mongo потребуется около недели, поэтому я просто тестирую локальную базу данных mongodb на своем компьютере (которая всегда находится в странном состоянии)

Затем с помощью специального синтаксиса nCore

// myModule.js
module.exports = {
  myMethod: function () { 
    this.mongo.doStuff(...)
  },
  expose: ["myMethod"]
};

// test-myModule.js
var module = require("myModule")

module.mongo = mongoMock
assert(module.myMethod() === ...)
0 голосов
/ 24 апреля 2014

Перезапись require для введения ваших издевательств - возможное решение.Тем не менее, я согласен с мнением Райноса:

Я лично считаю, что методология перезаписи требует для каждого файла "безобразный взлом" и предпочитаю использовать правильный DI.Однако он оптимален для макетирования одного или двух модулей в существующей кодовой базе без переписывания кода для поддержки DI.

Использование правильного внедрения зависимостей не только спасает вас от "уродливого взлома", но также позволяет вамприменять дополнительные случаи использования, кроме инъекционных насмешек.Например, в производственной среде вы можете, например, создавать экземпляры соединений по протоколу http и при определенных обстоятельствах внедрять иную реализацию для установления соединения по VPN.

Если вы хотите найти контейнер для внедрения зависимостей, прочитайте эту отличную статью и посмотрите Запустите! , который я реализовал.

0 голосов
/ 23 июня 2013

Вы легко смоделируете требование, используя «a»: https://npmjs.org/package/a

например, необходимо смоделировать require ('./ foo') в модульном тесте:
var fakeFoo = {};
var waitRequire = require ('a'). hopeRequire;
hopeRequire ('./ foo) .return (fakeFoo);

// в sut:
var foo= требовать ('./ foo);// возвращает fakeFoo

0 голосов
/ 02 марта 2012

Изучив предложение Ryanos, а также пакет Horaa на npm, я обнаружил эту тему в Google Group , которая указала мне на Sandboxed-Module.

Sandboxed-Module позволяет мне вводить / переопределять require () без необходимости выставлять такие зависимости для моих модульных тестов.

Я все еще нахожусь для других предложений;тем не менее, в данный момент Sandboxed-модуль соответствует моим потребностям.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...