У меня есть метод расширения со следующей подписью:
public static Expression<Func<T, bool>> And<T>(this Expression<Func<T, bool>> first, Expression<Func<T, bool>> second)
{
...
}
Я написал для него контрольный пример, который проверяет, действительно ли два выражения объединены. По крайней мере, чтобы новое выражение, которое я получаю, работало.
Теперь я хотел бы написать еще один тест-кейс, который просто гарантирует, что метод использует версию с коротким замыканием and
. Любая подсказка, как я могу это сделать?
Я думал, что смогу сделать что-то вроде этого:
[Test]
public void And_PredicatesAreShortCircuited()
{
var predicateNotUsed = true;
Expression<Func<int, bool>> a = x => false;
Expression<Func<int, bool>> b = x =>
{
predicateNotUsed = false;
return true;
};
var foo = new[] { 1, 2, 3, 4, 5, 6, 7 }
.Where(a.And(b).Compile())
.ToArray();
Assert.That(predicateNotUsed);
}
Но я получаю гигантский красный волнистый знак под всем этим телом оператора для b
, заявляющего, что "Лямбда-выражение с телом оператора не может быть преобразовано в дерево выражений" . Итак ... есть варианты? Или это невозможно написать тест?