Javascript 如何检测函数是否有return语句
我正在为javascript编写一个断言库。我希望断言是可链接的,因此每个断言都需要调用Javascript 如何检测函数是否有return语句,javascript,Javascript,我正在为javascript编写一个断言库。我希望断言是可链接的,因此每个断言都需要调用 返回这个 这样就可以对其运行更多断言 我想做的是编写一个测试,检查每个断言是否都有return语句。我可以想出两种解决方案,但我不确定我是否喜欢其中任何一种 有问题的解决方案-在我的测试中,我可以调用每个断言,看看它是否返回一个值。这是有问题的,因为我不知道断言是否会成功返回或抛出断言错误。理想情况下,我会在一个循环中调用所有断言,以便以相同的方式调用它们 Hacky solution-我可以在每个断言上调
返回这个代码>
这样就可以对其运行更多断言
我想做的是编写一个测试,检查每个断言是否都有return语句。我可以想出两种解决方案,但我不确定我是否喜欢其中任何一种
有问题的解决方案-在我的测试中,我可以调用每个断言,看看它是否返回一个值。这是有问题的,因为我不知道断言是否会成功返回或抛出断言错误。理想情况下,我会在一个循环中调用所有断言,以便以相同的方式调用它们
Hacky solution-我可以在每个断言上调用.toString()
,并使用正则表达式在函数体中查找字符串返回该字符串。我想这会很好,因为我可以解释正则表达式中的任意数量的空格,但这不会停止尝试通过将字符串放在不可访问的代码分支中来解决这个问题,例如,如果(!true)返回这个
我认为#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
,假设我实际执行了该函数
我希望这能澄清问题,如果没有,请告诉我。检查一下它是否返回未定义的值如何?如果函数只是说
return;
在它中,那么是的,它仍将返回未定义。但是,如果函数
return false;
在它(或任何其他值-包括对象、数字等)中,下面的测试将确定函数是否有返回
function fnReturnsAValue(fn){
if (typeof(fn)=="function" && typeof(fn())!="undefined") { return true; }
return false;
}
解决方案3:将断言函数转换为字符串,使用解析器生成AST并遍历它,查找返回该值代码>。但是,我认为1没有问题。我想您应该编写其他测试来确保每个断言都正确工作。测试返回值只是一个额外的测试(对于每个断言),您将提供一个空的来完成断言。您打算如何浏览您的断言列表?我认为那里的一些示例代码会有所帮助。我同意,解决方案1似乎应该这样做,如果此
预期为断言的实例
,那么您可以检查断言的assertFn()实例
对吗?对于缺少示例代码表示歉意。我可以为每个断言编写一个测试(不相信我不会这么做)。我所希望的是我现在和将来都能用的东西。现在我将添加一些示例代码。您不需要检查调用函数是否返回未定义的代码吗?或者它返回一个对象(比如预期的对象或错误对象)?请参见OP对该问题的评论:“这种方法的问题是没有办法保证断言将通过。一般来说,如果断言不通过,函数将抛出断言错误。”