c#中表达式树的单元测试
Unit test for Expression tree in c#
如何在 C# 中为表达式树编写单元测试。
我有这个 class 需要测试。这个方法 returns 一棵表达式树,也得到一个作为参数。
代码:
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
这应该很简单,尽管我将使用 Expression<Func<SpecFinderDataModel,bool>>
而不是内部使用的 LinqKit API,在 DoSearch
方法中,您需要 Expression<Func<SpecFinderDataModel,bool>>
作为输入,基于在假设以下作为类型定义的方法上 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
的组合,您可以创建任意数量的单元测试用例来测试您的代码
如何在 C# 中为表达式树编写单元测试。
我有这个 class 需要测试。这个方法 returns 一棵表达式树,也得到一个作为参数。
代码:
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
这应该很简单,尽管我将使用 Expression<Func<SpecFinderDataModel,bool>>
而不是内部使用的 LinqKit API,在 DoSearch
方法中,您需要 Expression<Func<SpecFinderDataModel,bool>>
作为输入,基于在假设以下作为类型定义的方法上 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
的组合,您可以创建任意数量的单元测试用例来测试您的代码