Можно ли проверить, что простое выражение всегда будет возвращать true? - PullRequest
2 голосов
/ 12 января 2010

И я имею в виду это самым простым способом. Допустим, у вас есть функция со следующей подписью:

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

Обычно это создает более сложное выражение некоторого вида, но если value равно null, метод должен возвращать постоянное, всегда истинное выражение. Другими словами:

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

    // ...
}

Это то, для чего я могу создать модульный тест? Что когда я отправляю null в качестве значения, я получаю постоянное истинное выражение?

Ответы [ 3 ]

6 голосов
/ 12 января 2010

Было бы достаточно легко проверить точно этого выражения (тело будет 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));
2 голосов
/ 12 января 2010

Нет способа сделать это, о чем я знаю. Однако, если вы хотите немного изменить рефакторинг:

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);
    }
}
1 голос
/ 12 января 2010

Что значит быть "простым" здесь? Это неясный термин ...

В общем, единственное, что мы можем сказать, это то, что это еще одно проявление проблемы остановки . Подумайте, как вы можете определить результат функции до всех возможных параметров, если вы на самом деле не запускаете ее при всех возможных параметрах? Помимо того, что это практически невозможно, вы даже не можете гарантировать результат из-за характера проблемы остановки (вы не знаете, что метод даже завершится, или по какому пути он может идти в неопределенном будущем).

...