2016-07-20 25 views
2

是否有任何方法来检查JavaScript绑定函数?如何检查JavaScript绑定函数

我想从一个函数返回一个绑定函数,并在单元测试中声明绑定函数的目标boundThis和boundArgs。它们似乎被定义为ECMAScript中的内部对象,并且不能在程序中访问。

有什么方法可以访问它们吗?或者也许有些需求相似的人已经写了一些模块补丁Function.prototype.bind()?

+3

FWIW ...在单元测试中你通常要测试*一段代码做什么*,而不是*它怎么做。测试的“什么”是什么,实施的“如何”。这在单元测试中似乎是错误的重点。 – deceze

+1

请参阅http://stackoverflow.com/questions/26545549/chaining-bind-calls-in-javascript-unexpected-result/26547029#26547029。调用绑定函数时使用的'this'不是该函数的某种隐藏属性。它是用于包装原始函数以创建绑定函数的逻辑的一部分。除了您可以检查函数中的局部变量或函数内部的任何其他逻辑之外,您无法检查,并且@Bergi正确地指出,您不想也不应该需要。 –

回答

1

不,没有(除非你启动调试器)。

无论如何你都不应该测试绑定函数。您也可以使用闭包来实现完全相同的行为,这也不会暴露闭包变量。这并不重要。您不应该测试实现,而是测试行为 - 只需检查调用返回的函数是否调用具有期望值的目标。

+0

谢谢你的回答。 – matianfu

+0

但我绝对不同意你在那个绑定函数不应该被测试。如今,ES6的承诺经常被使用。许多函数返回promise。但承诺是一个不透明的对象,无法检查承诺是什么,没有办法按值进行等式检查。更好的方法是返回一个绑定的函数,如果它可以被检查。由于承诺可能有副作用,它比解决承诺和断言结果好得多。保持测试功能“纯”是解决问题的关键。 – matianfu

+0

Promise与Haskell中的monad类似,意思是它包含一个值。但它本身不是一个价值。这是个问题。并且函数返回它不能是纯粹的。解决方法是使用表示绑定函数的对象作为返回值而不是承诺。它可以转化为一个没有歧义的承诺。那么这个对象可以直接声明,而不是解决承诺。函数返回这样的对象可以是纯的。 – matianfu