2016-07-20 13 views
2

Gibt es eine Möglichkeit, eine JavaScript-gebundene Funktion zu überprüfen?So überprüfen Sie eine JavaScript-gebundene Funktion

Ich möchte eine gebundene Funktion aus einer Funktion zurückgeben und in Unit-Tests das Ziel der gebundenen Funktion, boundThis und boundArgs geltend machen. Sie scheinen in ECMAScript als internes Objekt definiert zu sein und können im Programm nicht aufgerufen werden.

Gibt es eine Möglichkeit, auf sie zuzugreifen? oder vielleicht haben einige Leute mit ähnlichen Anforderungen bereits ein Modul-Patching Function.prototype.bind() geschrieben?

+3

FWIW ... in Komponententests, die Sie normalerweise testen möchten * was ein Stück Code macht * nicht * wie * es macht. Das "Was" ist der Test, das "Wie" ist die Umsetzung. Dies scheint die falsche Sache zu sein, auf die man sich bei einem Komponententest konzentriert. – deceze

+1

Siehe http://stackoverflow.com/questions/26545549/chaining-bind-calls-in-javascript-unexpected-result/26547029#26547029. Das 'this', das verwendet wird, wenn eine gebundene Funktion aufgerufen wird, ist keine versteckte Eigenschaft der Funktion. Es ist Teil der Logik, die zum Umbrechen der ursprünglichen Funktion zum Erstellen der gebundenen Funktion verwendet wird. Sie können das genauso wenig inspizieren, wie Sie eine lokale Variable in einer Funktion oder einer anderen Logik innerhalb einer Funktion untersuchen könnten, und wie @Bergi zu Recht darauf hinweist, wollen und müssen Sie nicht. –

Antwort

1

Nein, gibt es nicht (es sei denn, Sie starten einen Debugger).

Sie sollten sowieso nicht für gebundene Funktionen testen. Sie könnten das gleiche Verhalten auch mit einer Schließung erreichen, die auch die geschlossenen Variablen nicht offen legt. Und das macht nichts. Sie sollten die Implementierung nicht testen, sondern das Verhalten - also prüfen Sie einfach, ob das Aufrufen der zurückgegebenen Funktion das Ziel mit den erwarteten Werten aufruft.

+0

Vielen Dank für Ihre Antwort. – matianfu

+0

Aber ich stimme dir definitiv nicht zu, dass gebundene Funktionen nicht getestet werden sollten. Heutzutage werden ES6-Versprechen häufig verwendet. Viele Funktionen geben Versprechen zurück. Aber Versprechen ist ein undurchsichtiges Objekt, keine Möglichkeit zu überprüfen, was ein Versprechen ist, gibt es keine Methode, Gleichheitsprüfung nach Wert zu tun. Eine bessere Möglichkeit besteht darin, eine gebundene Funktion zurückzugeben, wenn sie überprüft werden könnte. Es ist viel besser als das Versprechen zu lösen und das Ergebnis zu behaupten, da das Versprechen wahrscheinlich Nebeneffekt hat. Die getestete Funktion "rein" zu halten, ist der Schlüssel zum Problem. – matianfu

+0

Versprechen ist so etwas wie die Monade in Haskell, in dem Sinne, dass es einen Wert enthält. Aber selbst ist kein Wert. Das ist ein Problem. und Funktionen zurückgeben kann es nicht rein sein. Eine Problemumgehungslösung verwendet ein Objekt, das eine gebundene Funktion als Rückgabewert anstelle von Versprechen darstellt. Es kann zu einem Versprechen ohne Zweideutigkeit umgewandelt werden. Dann kann dieses Objekt direkt geltend gemacht werden, anstatt das Versprechen zu lösen. Funktionen, die ein solches Objekt zurückgeben, können rein sein. – matianfu

Verwandte Themen