网站首页 网站源码
using System;
using System.Linq;
using System.Linq.Expressions;
using Dpz.Core.Infrastructure.ExpressTreeQuery;
using NUnit.Framework;
namespace Dpz.Core.Simple.Test;
public class GenerateExpressionTest
{
// 测试用的请求类
private class TestRequest
{
[QueryFilter(FilterCondition.NotNull)]
public string? Name { get; set; }
[QueryFilter(FilterCondition.EqualValue)]
public int Age { get; set; }
[QueryFilter(FilterCondition.NotNullOrEmpty)]
public string? Description { get; set; }
[QueryFilter(FilterCondition.GtValue)]
public decimal Price { get; set; }
}
// 测试用的实体类
private class TestEntity
{
public string? Name { get; set; }
public int Age { get; set; }
public string? Description { get; set; }
public decimal Price { get; set; }
}
[Test]
public void GenerateConditionExpressionTree_WithNullValues_ShouldReturnTrue()
{
// Arrange
var request = new TestRequest();
// Act
var expression = GenerateConditionFilter.GenerateConditionExpressionTree<
TestEntity,
TestRequest
>(request);
var func = expression.Compile();
var result = func(new TestEntity());
// Assert
Assert.That(result, Is.True);
}
[Test]
public void GenerateConditionExpressionTree_WithValidValues_ShouldReturnCorrectResult()
{
// Arrange
var request = new TestRequest
{
Name = "Test",
Age = 18,
Description = "Description",
Price = 100,
};
// Act
var expression = GenerateConditionFilter.GenerateConditionExpressionTree<
TestEntity,
TestRequest
>(request);
var func = expression.Compile();
// Assert
var matchingEntity = new TestEntity
{
Name = "Test",
Age = 18,
Description = "Description",
Price = 200,
};
Assert.That(func(matchingEntity), Is.True);
var nonMatchingEntity = new TestEntity
{
Name = "Test",
Age = 17,
Description = "Description",
Price = 50,
};
Assert.That(func(nonMatchingEntity), Is.False);
}
[Test]
public void GenerateConditionExpressionTree_WithContainsComparison_ShouldWorkCorrectly()
{
// Arrange
var request = new TestRequest { Name = "Test", Description = "Test Description" };
// Act
var expression = GenerateConditionFilter.GenerateConditionExpressionTree<
TestEntity,
TestRequest
>(request);
var func = expression.Compile();
// Assert
var entity = new TestEntity { Name = "Test", Description = "Test Description" };
Assert.That(func(entity), Is.True);
}
[Test]
public void GenerateConditionExpressionTree_WithMultipleEntities_ShouldWorkCorrectly()
{
// Arrange
var request = new TestRequest { Name = "Test", Age = 18 };
// Act
var expression = GenerateConditionFilter.GenerateConditionExpressionTree<
TestEntity,
TestEntity,
TestRequest
>(request);
var func = expression.Compile();
// Assert
var entity1 = new TestEntity { Name = "Test", Age = 18 };
var entity2 = new TestEntity { Name = "Test", Age = 18 };
Assert.That(func(entity1, entity2), Is.True);
}
}
上述代码是一个单元测试类,使用 NUnit 框架来测试一个名为 GenerateConditionFilter
的类的功能。这个类的目的是根据请求对象生成条件表达式树,以便在查询实体时应用过滤条件。以下是代码的详细解释:
TestRequest
这个类定义了几个属性,这些属性带有 QueryFilter
特性,用于指定不同的过滤条件:
Name
: 可能为 null
,使用 NotNull
条件。Age
: 整数类型,使用 EqualValue
条件。Description
: 可能为 null
,使用 NotNullOrEmpty
条件。Price
: 小数类型,使用 GtValue
条件。TestEntity
这个类定义了与 TestRequest
类似的属性,但没有任何特性。它用于模拟数据库中的实体。
该类包含多个测试方法,每个方法都测试 GenerateConditionFilter.GenerateConditionExpressionTree
方法的不同场景。
GenerateConditionExpressionTree_WithNullValues_ShouldReturnTrue
null
时,生成的表达式是否返回 true
。TestRequest
对象(所有属性为 null
),然后生成条件表达式并应用于一个空的 TestEntity
对象,期望返回 true
。GenerateConditionExpressionTree_WithValidValues_ShouldReturnCorrectResult
TestRequest
对象,并生成条件表达式。然后测试两个 TestEntity
对象,一个匹配请求条件,另一个不匹配,期望返回相应的布尔值。GenerateConditionExpressionTree_WithContainsComparison_ShouldWorkCorrectly
Name
和 Description
属性包含特定值时,生成的表达式是否能正确匹配实体。TestRequest
对象,并生成条件表达式。然后测试一个匹配的 TestEntity
对象,期望返回 true
。GenerateConditionExpressionTree_WithMultipleEntities_ShouldWorkCorrectly
TestRequest
对象,并生成条件表达式。然后测试两个相同的 TestEntity
对象,期望返回 true
。这个测试类的主要功能是验证 GenerateConditionFilter
类的 GenerateConditionExpressionTree
方法在不同情况下的行为,确保它能够根据请求对象的属性生成正确的条件表达式,并在应用于实体时返回预期的结果。通过这些测试,可以确保代码的正确性和健壮性。