目录
介绍
背景
使用代码
兴趣点
介绍数据验证在大多数应用程序中都很常见。Fluent Validations是执行数据验证数据输入的一种非常流行的方式。
这是关于如何对这些验证进行单元测试以确保它们执行预期验证的技巧。
背景本技巧假设您对设置控制台应用程序和单元测试项目有基本的了解。
这是该FluentValidation页面的链接,可获取有关其库的更多信息和文档。
这是整个项目代码的GitHub链接。
单元测试有很多不同的测试运行器,这个技巧使用MS Test作为测试运行器,如果你使用XUnit或NUnit或其他一些单元测试运行器,语法可能会有所不同。
使用代码这是一个基本的.NET Framework 4.8控制台应用程序,用于设置程序代码。
该程序执行以下基本步骤:
- 创建一个新Item对象并设置该对象的属性。
- 创建ItemValidator类的实例以验证object实例上的属性。
- 验证Item对象实例上的值。
- 检查结果并报告错误。
item验证类继承自FluentValidations AbstractValidator基类:
- 继承的类为Item类的每个属性创建规则。
- 大多数验证规则都是Fluent Validation开箱即用的。
- 验证日期值有一个自定义验证。
using FluentValidation;
using FluentValidation.Results;
using System;
using System.Collections.Generic;
namespace UnitTestFluentValidations
{
class Program
{
static void Main(string[] args)
{
var item = new Item(12345, 23456789, new DateTime(1900, 01, 01));
var itemValidator = new ItemValidator();
ValidationResult results = itemValidator.Validate(item);
bool success = results.IsValid;
IList failures = results.Errors;
Console.WriteLine(failures);
}
}
public class Item
{
public Item()
{
}
public Item(int clientId, long orgUid, DateTime checkDate)
{
_clientId = clientId;
_orgUid = orgUid;
_checkDate = checkDate;
}
private int _clientId { get; set; }
private long _orgUid { get; set; }
private DateTime _checkDate { get; set; }
public int ClientId
{
get { return _clientId; }
set { _clientId = value; }
}
public long OrgUid
{
get { return _orgUid; }
set { _orgUid = value; }
}
public DateTime CheckDate
{
get { return _checkDate;}
set { _checkDate = value; }
}
}
public class ItemValidator : AbstractValidator
{
public ItemValidator()
{
RuleFor(x => x.ClientId).GreaterThan(0).NotNull().WithMessage
("ClientId cannot be null");
RuleFor(x => x.OrgUid).NotNull().GreaterThan(0).
WithMessage("OrgUid cannot be null");
RuleFor(x => x.CheckDate).Must(BeAValidDate).WithMessage
("Check date must be a validate date");
}
private bool BeAValidDate(DateTime date)
{
return !date.Equals(default(DateTime));
}
}
}
这是用于程序的packages.config:
这是单元测试代码,用于布置测试以验证在程序中创建的验证是否按预期执行。
- 单元测试的命名是为了描述它们正在测试的属性和属性验证。
using FluentValidation.TestHelper;
using Microsoft.VisualStudio.TestTools.UnitTesting;
using System;
using UnitTestFluentValidations;
namespace FluentValidationTests
{
[TestClass]
public class FluentValidationTests
{
private ItemValidator validator;
[TestInitialize]
public void TestInitialize()
{
validator = new ItemValidator();
}
[TestMethod]
public void Validate_ClientId_Is_Null()
{
var item = new Item { OrgUid = 123456, CheckDate = new DateTime(2020,4,1)};
var result = validator.TestValidate(item);
result.ShouldHaveValidationErrorFor(x => x.ClientId);
}
[TestMethod]
public void Validate_ClientId_Is_LessThanZero()
{
var item = new Item {ClientId = -1, OrgUid = 123456,
CheckDate = new DateTime(2020, 4, 1) };
var result = validator.TestValidate(item);
result.ShouldHaveValidationErrorFor(x => x.ClientId);
}
[TestMethod]
public void Validate_OrgUid_is_Null()
{
var item = new Item { ClientId = 12345,
CheckDate = new DateTime(2020, 4, 1) };
var result = validator.TestValidate(item);
result.ShouldHaveValidationErrorFor(x => x.OrgUid);
}
[TestMethod]
public void Validate_OrgUid_is_LessThanZero()
{
var item = new Item { ClientId = 12345, OrgUid = -1000,
CheckDate = new DateTime(2020, 4, 1) };
var result = validator.TestValidate(item);
result.ShouldHaveValidationErrorFor(x => x.OrgUid);
}
[TestMethod]
public void Validate_CheckDate_is_InValid()
{
var item = new Item { ClientId = 12345, OrgUid = 321654987,
CheckDate = default(DateTime) };
var result = validator.TestValidate(item);
result.ShouldHaveValidationErrorFor(x => x.CheckDate);
}
}
}
这是用于单元测试项目的packages.config:
单元测试可能是开发人员用来帮助防止代码错误逃逸到生产系统中的最有效工具之一。虽然这不是单元测试的明确方法,但这应该能够帮助在流行的数据验证库上设置单元测试。
https://www.codeproject.com/Tips/5311988/Unit-Testing-Fluent-Validations