web-dev-qa-db-fra.com

Proxyquire, rewire, SandboxedModule et Sinon: avantages et inconvénients

En se moquant des dépendances Node, je suis tombé sur les bibliothèques suivantes:

Ils semblent tous faire plus ou moins la même chose: vous permettre de vous moquer des appels de require() (à l'exception de Sinon qui se moque à peu près de tout). Ils semblent tous nécessiter une configuration assez élaborée, notant la syntaxe exacte de la chaîne passée à require - pas très bien lors du refactoring.

Quels sont les avantages et les inconvénients de chaque bibliothèque? Quand devrais-je choisir l'un plutôt que l'autre? Quels sont des exemples de cas d'utilisation où chaque bibliothèque excelle? Quels sont les autres produits de cet espace qui sont meilleurs?

60
robrich

Cela ressemble totalement à de la triche, mais comme personne d'autre ne répond à la question, voici:

  • Proxyquire reprend require et vous permet d'injecter des contrefaçons n'importe où dans la chaîne de dépendance. Pour les requires que vous ne prenez pas le relais et pour les méthodes que vous ne définissez pas pour les requires que vous prenez le relais, cela reviendra à l'original. Cela peut être désactivé avec noCallThru. Ainsi, il charge toujours l'original, remplace simplement les choses par les choses que vous définissez. Contrairement à Rewire et SandboxedModule, vous ne pouvez pas définir de variables globales pour vos surcharges require.

  • Rewire reprend require et injecte __get__ et __set__ propriétés dans chaque module. Si vous connaissez le nom de la variable privée, vous pouvez le remplacer. Pensez à l'injection de dépendance.

  • SandboxedModule est presque identique à Proxyquire, sauf qu'il exécute l'ensemble du processus dans un nouveau V8 vm. (Il y a un coût de performance par test pour cette approche.) Il y a aussi un bogue désagréable dans la version 1.0 qui le fait échouer quand quelque chose que vous n'avez pas remplacé fait référence à un module natif qu'il ne prend pas en charge. Voir https://github.com/robrich/sandboxed-module-graceful-fs .

  • Sinon ne prend pas le contrôle de require comme les trois autres. Il s'agit plutôt d'un cadre de simulation plus traditionnel. Remplacez les méthodes spécifiées par des contrefaçons ou créez une maquette qui suit son appel.

120
robrich