在javascript中实现断言并不困难:
assert = function(expression,errorMessage){
if (!expression){
errorMessage = errorMessage || "(no msg)";
throw new Error("assert failed: "+errorMessage);
}
return true;
};
但是,使用这个版本的assert很烦人,因为每个测试用例都必须有一个有意义的错误消息:
var types = {isNumber:function(x){return typeof x === "number" && isFinite(x)}}
assert(types.isNumber(1)===true,"types.isNumber(1)===true");
assert(types.isNumber(NaN)===false,"types.isNumber(NaN)===false");
我的问题是,有没有办法实现断言函数,这样它只需要一个表达式,如果不满足该表达式,它可以返回有意义的错误消息?像:
assert(SOMETHING_that_is_not_true); // throw Error: SOMETHINGELSE that refers to this particular assertion
assert(SOMETHING_that_is_not_true2); // throw Error: SOMETHINGELSE2 that refers to this different assertion
答案 0 :(得分:2)
对于每个断言,它的代码多于一个简单的表达式,但是这个怎么样?
assert = function(expression){
if (!expression()){
errorMessage = expression.toString() || "(no msg)";
throw new Error("assert failed: "+errorMessage);
}
return true;
};
assert(function() { return 'b' == 'a' });
答案 1 :(得分:0)
我只是想添加它,因为将工作。但它是
因为它使用eval,即juck。但是,如果您不面对客户端,它会很有用。 (我在说什么?不建议。结束。但确实有效。)
function assert(expression){
var success = eval(expression);
if(!success) throw new Error("assert failed: "+ expression);
else return true;
}
然后你可以做
assert("types.isNumber(1)===true");
重申一下,上面使用@James Thorpe的代码(希望如此)。