2014-06-12 20 views
52

Kiedy szydząc zależności węźle Ja się na następujących bibliotek:Proxyquire, ReWire, SandboxedModule i Sinon: plusy i minusy

Wszystkie wydają się robić mniej więcej to samo: allo w kpić z połączeń require() (z wyjątkiem Sinona, który kpi prawie ze wszystkiego). Wszystkie wydają się wymagać dość skomplikowanej konfiguracji, zwracając uwagę na dokładną składnię łańcucha przekazanego do require - niezbyt dobrą podczas refaktoryzacji.

Jakie są plusy i minusy każdej biblioteki? Kiedy wybrałbym jedną nad drugą? Jakie są przykładowe przypadki użycia, w których każda biblioteka jest doskonała? Jakie są inne produkty w tej przestrzeni, które są lepsze?

Odpowiedz

102

To całkowicie czuje się jak oszustwo, ale ponieważ nikt inny nie jest odpowiedź na pytanie, tu idzie:

  • Proxyquire przejmuje wymaga i pozwala wstrzyknąć podróbki gdziekolwiek w łańcuchu zależności. Ponieważ nie wymaga się przejęcia, a metody, których nie definiujesz, wymagają przejęcia, zostaną przywrócone do oryginału. Można to wyłączyć za pomocą noCallThru. W ten sposób wciąż ładuje oryginał, tylko zastępuje rzeczy zdefiniowanymi przez ciebie. W przeciwieństwie do Rewire i SandboxedModule, nie możesz definiować zmiennych globalnych, które wymagają przeciążenia.

  • Rewire przejmuje i wprowadza do każdego modułu właściwości __get__ i __set__. Jeśli znasz nazwę zmiennej prywatnej, możesz ją zastąpić. Zastanów się nad wtryskiem zależności.

  • SandboxedModule jest prawie identyczny z Proxyquire, z tym wyjątkiem, że uruchamia cały proces w nowym VM V8. (Dla tego podejścia występuje koszt testu za test). Ma również nieprzyjemny błąd w wersji 1.0, który sprawia, że ​​kończy się niepowodzeniem, gdy coś, czego nie zastąpiłeś, odwołuje się do natywnego modułu, który nie obsługuje. Zobacz https://github.com/robrich/sandboxed-module-graceful-fs.

  • Sinon nie przejmuje wymagań tak jak inne 3. Raczej jest to bardziej tradycyjne szydercze ramy. Zamień określone metody na podróbki lub stwórz symulację, która śledzi, gdy została wywołana.

+17

Zupełnie nie oszukiwać - samoodpowiadają się świetnie! –

+0

Czy masz pomysł z góry, jak ważny jest "koszt wydajności za test"? Czy ktoś zrobił jakieś testy perfekcyjne? Używamy SandboxedModule i wydaje się bardzo powolny. Używałem proxyquire przed i lubię to. Zastanawiasz się, czy warto się zmienić. – tandrewnichols

+1

Nie przeprowadziłem między nimi perfekcyjnych testów, ale przekonwertowałem kod z Sandboxed na Proxyquire (aby obejść błąd v1.0) i przypadkowo uzyskałem bardzo znaczące zyski wydajności. – robrich

Powiązane problemy