2014-06-12 19 views
52

Quando beffardo dipendenze Nodo, mi è capitato sulle seguenti librerie:Proxyquire, ricollegare, SandboxedModule, e Sinon: pro e contro

Tutti sembrano fare più o meno la stessa cosa: allo vuoi prendere in giro le chiamate require() (con l'eccezione di Sinon che prende in giro praticamente tutto). Sembrano tutti richiedere un setup piuttosto elaborato, notando l'esatta sintassi della stringa passata a require - non eccezionale durante il refactoring.

Quali sono i pro e i contro di ciascuna libreria? Quando dovrei scegliere l'uno rispetto all'altro? Quali sono i casi d'uso d'esempio in cui ogni biblioteca eccelle? Quali sono gli altri prodotti in questo spazio che sono migliori?

risposta

102

ci si sente totalmente come barare, ma dal momento che nessun altro è rispondere alla domanda, ecco qui:

  • Proxyquire prende il sopravvento richiede e consente di iniettare falsi in qualsiasi punto della catena di dipendenza. Perché richiede che tu non prenda il sopravvento e che per i metodi che non definisci in quanto richiede che tu prenda il controllo, ricadrà sull'originale. Questo può essere disabilitato con noCallThru. Quindi carica ancora l'originale, sostituisce semplicemente le cose con le cose che definisci. A differenza di Rewire e SandboxedModule, non è possibile definire variabili globali per il sovraccarico richiesto.

  • Rewire prende in consegna richiede e inietta le proprietà __get__ e __set__ in ciascun modulo. Se conosci il nome della variabile privata, puoi sostituirlo. Pensa all'iniezione di dipendenza.

  • SandboxedModule è quasi identico a Proxyquire tranne che esegue l'intero processo in un nuovo V8 VM. (C'è un costo per le prestazioni per test a questo approccio.) Ha anche un brutto bug in v 1.0 che lo fa fallire quando qualcosa che non hai sostituito fa riferimento a un modulo nativo che non supporta. Vedi https://github.com/robrich/sandboxed-module-graceful-fs.

  • Sinon non ha bisogno di subentrare come l'altro 3. Piuttosto, è una struttura di derisione più tradizionale. Sostituisci i metodi specificati con falsi, o crea un mock che tiene traccia quando è stato chiamato.

+17

Totalmente non barare - le risposte di sé sono fantastiche! –

+0

Hai idea di quanto sia significativo il "costo di prestazione per test"? O qualcuno ha fatto qualche perf-test? Usiamo SandboxedModule e sembra molto lento. Ho usato proxyquire prima e mi piace. Mi chiedo se valga la pena lo sforzo di dev di cambiare. – tandrewnichols

+1

Non ho eseguito test di perf tra di loro, ma ho convertito una base di codice da Sandboxed a Proxyquire (per aggirare il bug v1.0) e ho accidentalmente prodotto guadagni di prestazioni molto significativi. – robrich