【问题标题】:Pass Expression<Func<Type, bool>> as TestCase将 Expression<Func<Type, bool>> 作为 TestCase 传递
【发布时间】:2016-01-26 10:42:44
【问题描述】:

有谁知道我可以如何参数化以下内容:

[Test]
void SelectTest(Expression<Func<MyType, bool>> where)
{
    try
    {
        using (var db = new DataConnection("MyData"))
        {
            where = e => e.Status == Status.New;

            var data = db.GetTable<MyType>()
            .(where.Compile())
            .Select(e => e);

            Assert.IsNotEmpty(data);
        }
    }
    catch (Exception)
    {
        Assert.False(true);
    }
}

我尝试添加这样的测试用例:

[TestCase(e => e.Status == Status.New)]

但我收到以下错误:

表达式不能包含匿名方法或 lambda 表达式。

我错过了什么?

(我使用的是 linq2db 和 nunit)

【问题讨论】:

    标签: c# linq unit-testing nunit


    【解决方案1】:

    显然我可以使用 NUnits TestCaseSource 来传递 Funcs。

    Pass lambda to parameterized NUnit test

    我的解决方案:

    public class SelectCollection
    {
        public static IEnumerable<Expression<Func<Evaluation, bool>>> Evaluation
        {
            get
            {
                yield return (e) => e.Status == Status.New;
                yield return (e) => e.Id == 0;
            }
        }
    }
    

    用作:

    [Test]
    [TestCaseSource(typeof(SelectCollection), "Evaluation")]
    public void SelectTest(Expression<Func<Evaluation, bool>> where)
    

    【讨论】:

    • 是的,您可以使用测试源,但是您能立即看到测试变得多么不可读吗?其他开发者维护它的机会有多大?
    • 我同意,但我是唯一维护测试的人。事实上,我是唯一进行单元/集成测试的人。
    【解决方案2】:

    您不能将复杂的表达式作为测试参数传递,只支持常量基本类型。

    【讨论】:

    • 这就是我的想法......我想我会去概括并编写查询特定的测试......
    • 你有资源支持吗?
    • @grmbl stackoverflow.com/a/1235690/446515 这是 C# 语言中的一条规则,适用于所有属性,而不仅仅是 TestCase
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多