是否可以检查一个简单的表达式是否总是返回true?

时间:2010-01-12 13:07:32

标签: c# unit-testing lambda expression-trees

我的意思是最简单的方式。假设您有一个具有以下签名的功能:

public static Expression<Func<T, bool>> CreateExpression<T>(string value)
{
    // ...
}

通常它会创建某种更复杂的表达式,但如果valuenull,则该方法应返回一个常量,始终为true的表达式。换句话说:

public static Expression<Func<T, bool>> CreateExpression<T>(string value)
{
    if(value == null)
        return x => true;

    // ...
}

这是我可以创建单元测试吗?当我发送null作为值时,我确实得到了一个恒定的真实表达式?

3 个答案:

答案 0 :(得分:6)

很容易测试完全该表达式(正文将是ConstantExpression,其值为true)。但在一般情况下呢?不 - 太复杂了。

static bool IsConstantTrue(LambdaExpression lambda)
{
    return lambda.Body.NodeType == ExpressionType.Constant
        && true.Equals(((ConstantExpression)lambda.Body).Value);
}

Expression<Func<SomeType, bool>> exp = x => true; // or some method that 
                                                  // returns a lambda expression
Assert.IsTrue(IsConstantTrue(exp));

答案 1 :(得分:2)

我知道没有办法这样做。但是,如果你愿意重构一下:

class Sample<T>
{
    public static Func<T, bool> Identity = x => true;

    public static Func<T, bool> CreateExpression(string value)
    {
        if(value == "foo")
            return Identity;

        return x => value.Length % 2 == 0;
    }
}

class Test
{
    public void DoTest()
    {
        Debug.Assert(Sample<string>.CreateExpression("foo") == Sample<string>.Identity);
    }
}

答案 2 :(得分:1)

这里的“简单”是什么意思?这是一个毛茸茸的词......

一般来说,我们唯一可以接受的是这是halting problem的另一种表现形式。考虑一下,除非您在所有可能的参数下实际运行,否则如何确定函数的结果直到所有可能的参数?除了实际上不可行之外,你甚至不能保证结果,因为停止问题的性质(你不知道该方法甚至会终止,或者在无限期的未来可能采取什么样的路径)。