Подтвердить что ты не робот

Proxyquire, rewire, SandboxedModule и Sinon: плюсы и минусы

Когда насмехаются с зависимостями Node, я встречался в следующих библиотеках:

Все они, кажется, делают больше или меньше одно и то же: позвольте вам высмеивать вызовы require() (за исключением Sinon, который издевается над всем чем угодно). Кажется, что все они требуют довольно сложной настройки, отмечая точный синтаксис строки, переданной в require - невелика при рефакторинге.

Каковы плюсы и минусы каждой библиотеки? Когда я буду выбирать один за другим? Каковы примерные варианты использования каждой библиотеки? Какие другие продукты в этом пространстве лучше?

4b9b3361

Ответ 1

Это абсолютно похоже на обман, но поскольку никто не отвечает на этот вопрос, здесь говорится:

  • Proxyquire берет на себя обязательство и позволяет вам вводить подделки где угодно в цепочке зависимостей. Для этого требуется, чтобы вы не взяли верх и не использовали методы, которые вы не определяете, потому что вам нужно взять на себя ответственность, они вернутся к оригиналу. Это можно отключить с помощью noCallThru. Таким образом, он все еще загружает оригинал, просто заменяет вещи тем, что вы определяете. В отличие от Rewire и SandboxedModule, вы не можете определить глобальные переменные для ваших перегрузок.

  • Ревикс берет на себя требование и вводит свойства __get__ и __set__ в каждый модуль. Если вы знаете имя частной переменной, вы можете его заменить. Подумайте об инъекции зависимостей.

  • SandboxedModule почти идентичен Proxyquire, за исключением того, что он запускает весь процесс в новом V8 vm. (Для этого подхода есть стоимость исполнения для каждого теста.) У него также есть неприятная ошибка в версии 1.0, которая заставляет его терпеть неудачу, когда что-то, что вы не заменили ссылками, не поддерживает собственный модуль, который он не поддерживает. См. https://github.com/robrich/sandboxed-module-graceful-fs.

  • Синон не берет на себя, как другой 3. Скорее, это более традиционная насмешка. Замените указанные методы на подделку или создайте макет, который отслеживает, когда он был вызван.