我正在为javascript编写一个断言库。我希望断言是可链接的,因此每个断言都需要调用
return this;
以便可以在其上运行更多断言。
我想要做的是编写一个测试,检查每个断言是否都有return语句。我可以想到两个解决方案,我不确定我喜欢它们中的任何一个。
有问题的解决方案 - 在我的测试中,我可以调用每个断言,看看它是否返回一个值。这是有问题的,因为我不知道断言是成功返回还是抛出断言错误。理想情况下,我会在循环中调用所有断言,因此我可以用相同的方式调用它们。
Hacky解决方案 - 我可以在每个断言上调用.toString()
并使用正则表达式在函数体中查找字符串return this
。我认为这可以很好地工作,因为我可以解释正则表达式中的任何数量的空白,但是这并不会因为将字符串放在一个无法访问的代码分支(例如if(!true) return this
)而试图解决该解决方案。
我认为#2可能更简单,但我不喜欢它。有没有人有其他解决方案?
编辑:我想如何编写这些测试的示例代码:
var assertionFns = getAssertionFns(); // actual generation process not relevant
assertionFns.forEach(function(fn){
test(fnReturnsAValue(fn));
});
function fnReturnsAValue(fn){
// What goes here?
}
function test(value){
if(!value){
// fail the test
}
}
重申为什么#1有问题,如果断言失败,fn
将抛出AssertionError
,假设我实际执行了该函数。
我希望这澄清一下,如果没有,请告诉我。
答案 0 :(得分:0)
如果检查它是否未返回undefined怎么样?如果函数只是说
return;
然后是,它仍将返回undefined。但是如果函数有
return false;
在其中(或任何其他值 - 包括对象,数字等),然后以下测试将确定函数是否有返回
function fnReturnsAValue(fn){
if (typeof(fn)=="function" && typeof(fn())!="undefined") { return true; }
return false;
}