我的意思是最简单的方式。假设您有一个具有以下签名的功能:
public static Expression<Func<T, bool>> CreateExpression<T>(string value)
{
// ...
}
通常它会创建某种更复杂的表达式,但如果value
为null
,则该方法应返回一个常量,始终为true的表达式。换句话说:
public static Expression<Func<T, bool>> CreateExpression<T>(string value)
{
if(value == null)
return x => true;
// ...
}
这是我可以创建单元测试吗?当我发送null
作为值时,我确实得到了一个恒定的真实表达式?
答案 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的另一种表现形式。考虑一下,除非您在所有可能的参数下实际运行,否则如何确定函数的结果直到所有可能的参数?除了实际上不可行之外,你甚至不能保证结果,因为停止问题的性质(你不知道该方法甚至会终止,或者在无限期的未来可能采取什么样的路径)。