javascript - 一个断言函数,不要求您输入错误消息

时间:2014-10-24 16:27:04

标签: javascript assert

在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

2 个答案:

答案 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的代码(希望如此)。