【问题标题】:Unit test for Expression tree in c#c#中表达式树的单元测试
【发布时间】:2019-01-06 09:04:07
【问题描述】:

如何在 C# 中为表达式树编写单元测试。

我有这个需要测试的课程。此方法返回一个表达式树,并获取一个作为参数。

代码:

public ExpressionStarter<SpecFinderDataModel> DoSearch(bool status, string searchValue, ExpressionStarter<SpecFinderDataModel> predicate)
{
    var localPredicate = predicate;
    if (status == false)
    {
        var searchTerms = searchValue.Split(' ').ToList().ConvertAll(x => x.ToLower());
        localPredicate = localPredicate.Or(s => searchTerms.Any(srch => s.ProductID.ToLower().Contains(srch)));
        localPredicate = localPredicate.Or(s => searchTerms.Any(srch => s.ISBN13.ToLower().Contains(srch)));
        localPredicate = localPredicate.Or(s => searchTerms.Any(srch => s.Title.ToLower().Contains(srch)));
    }
    return localPredicate;
}

任何建议都会有所帮助。谢谢。

更新 #1 我已将 LinqKit 用于 ExpressionStarter

【问题讨论】:

  • 编译结果表达式为Func,并用相关输入验证结果
  • 问题是我已经为基本概念编写了单元测试,但没有为使用表达式等高级概念编写单元测试。我不知道。你能指点我在哪里看吗?

标签: c# expression mstest xunit linqkit


【解决方案1】:

这应该很简单,虽然我将使用Expression&lt;Func&lt;SpecFinderDataModel,bool&gt;&gt;而不是内部使用的LinqKit API,在DoSearch方法中,您需要Expression&lt;Func&lt;SpecFinderDataModel,bool&gt;&gt;作为输入,基于假设以下作为定义的方法类型为SpecFinderDataModel

public class SpecFinderDataModel
{
    public string ProductID {get; set;}

    public string ISBN13 {get; set;}

    public string Title {get; set;}
}

现在您需要简单地测试各种选项,就像在常规单元测试中所做的那样,一个示例:

   // Initial Expression value constant false is the result
   Expression<Func<SpecFinderDataModel, bool>> expr = c => false;

    // SpecFinderDataModel Object
    var sfd = new SpecFinderDataModel
    {
     ISBN13 = "",
     ProductID = "Test A B C",
     Title = ""
    }

    // Call DoSearch and supply the sfd for testing
    var result = DoSearch(false,"Test",expr).Compile()(sfd);

    // Assert the result in the unit test to understand 
    Assert.True(result,true);

像这样基于DoSearch参数和测试对象sfd的组合,你可以创建任意数量的单元测试用例来测试你的代码

【讨论】:

  • 你太棒了。它就像一个魅力。谢谢@Mrinal
  • 欢迎,很高兴它有帮助
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-05-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-05-14
  • 1970-01-01
相关资源
最近更新 更多