一个不需要输入错误消息的assert函数

an assert function that doesnt require you to enter an error message

本文关键字:消息 错误 assert 函数 输入 不需要 一个      更新时间:2023-09-26

用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函数,使其只接受一个表达式,并且如果不满足该表达式,它可以返回有意义的错误消息?类似:

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

对于每个断言,它的代码比简单的表达式多一点,但这怎么样?

assert = function(expression){
    if (!expression()){
        errorMessage = expression.toString() || "(no msg)";
        throw new Error("assert failed: "+errorMessage);
    }
    return true;
};
assert(function() { return 'b' == 'a' });

我只想添加它,因为它工作。但它是

不建议

因为它使用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代码(希望如此)。