单元测试Fluent验证
目录
介绍
背景
使用代码
兴趣点
介绍
数据验证在大多数应用程序中都很常见。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<validationfailure> 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<item>{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:
<!--?xml version="1.0" encoding="utf-8"?-->
<packages><package id="FluentValidation" targetframework="net48" version="9.5.1">
</package></packages>
这是单元测试代码,用于布置测试以验证在程序中创建的验证是否按预期执行。
- 单元测试的命名是为了描述它们正在测试的属性和属性验证。
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:
<!--?xml version="1.0" encoding="utf-8"?-->
<packages><package id="FluentValidation" targetframework="net48" version="9.5.1"><package id="MSTest.TestAdapter" targetframework="net48" version="2.1.1"><package id="MSTest.TestFramework" targetframework="net48" version="2.1.1">
</package></package></package></packages>
兴趣点
单元测试可能是开发人员用来帮助防止代码错误逃逸到生产系统中的最有效工具之一。虽然这不是单元测试的明确方法,但这应该能够帮助在流行的数据验证库上设置单元测试。
https://www.codeproject.com/Tips/5311988/Unit-Testing-Fluent-Validations
单元测试Fluent验证相关推荐
- Fluent验证案例43:平板边界层转捩
本案例演示流体流经平板时流动状态从层流向湍流转捩过程. [1]A. M. Savill. "Some recent progress in the turbulence modeling o ...
- Fluent验证案例05:管道中的泊肃叶流动
几何模型参数 在scdm中创建几何模型 然后导入mesh中进行网格划分,网格数为11000,边界层为5层 导入fluent中进行计算,设置参数详见参考资料 速度 速度矢量(入口处) 压降计算 Area ...
- Fluent验证案例17:RAE2822翼型
感谢drjiangliang的分享!谢谢! http://www.360doc.com/content/18/1128/14/50625244_797791736.shtml
- 实战SSM_O2O商铺_05集成SSM后验证DAO层、Service层、Controller层的配置
文章目录 概述 验证DAO层的配置 接口 SQL映射文件 单元测试类 基类 DAO层单元测试类 验证Service层的配置 接口以及实现类 单元测试类 验证Controller层的配置 控制层 启动服 ...
- 软件测试系列之四 单元测试(Junit)
在线课堂:https://edu.csdn.net/lecturer/1516 单元测试简介 单元测试就是测试程序员依据其所设想的方式开发出来的程序是否产生了预期的结果.单元测试是与软件开发生命周期 ...
- 单元测试:如何编写可测试的代码及其重要性
原文来自互联网,由长沙DotNET技术社区编译.如译文侵犯您的署名权或版权,请联系小编,小编将在24小时内删除.限于译者的能力有限,个别语句翻译略显生硬,还请见谅. 作者:谢尔盖·科洛迪(SERGEY ...
- 单元测试junit参数_使用Junit参数在更少的时间内编写更好的单元测试
单元测试junit参数 大多数人都知道单元测试的重要性和好处,以及为什么要在进行的项目中使用它们. 而且,大多数人不喜欢在他们从事的项目中编写单元测试. TDD的人当然处于另一面,但根据我的经验,他们 ...
- junit 验证日志输出_JUnit规则–引发异常时执行附加验证
junit 验证日志输出 在本文中,我将快速向您展示如果您需要解决以下挑战,那么JUnit规则有多方便 一个方法可以捕获异常,并且必须在抛出或引发包装异常之前执行一些额外的任务. 调用额外任务和引发的 ...
- 使用Junit参数在更短的时间内编写更好的单元测试
大多数人都知道单元测试的重要性和好处,以及为什么要在进行的项目中使用它们. 而且,大多数人不喜欢在他们从事的项目中编写单元测试. TDD的人当然处于另一面,但根据我的经验,他们在IT行业中是少数派. ...
最新文章
- java字符串缓冲池分析
- php 加权计算公式,PHP计算加权平均数的实例分享
- Android 使用反射机制获取或设置系统属性(SystemProperties)
- 《学习opencv》笔记——矩阵和图像处理——cvGEMM,cvGetCol,cvGetCols and cvGetDiag
- JZOJ 5421. 【NOIP2017提高A组集训10.25】嘟嘟噜
- 【算法竞赛学习】金融风控之贷款违约预测-赛题理解
- 2017.3.6 种树 失败总结
- django-xadmin出现Models aren't loaded yet错误
- 只出现一次的数字 (桶排序和位运算)
- 盘点开发者最爱的 IntelliJ 插件 Top 10
- java包含_【Java】判断字符串是否包含子字符串
- 将图片从AutoCAD导出到Word
- 小程序模板订阅操作【小程序订阅消息】
- retrofit应用详解与源码解析--源码解析
- html文字竖排垂直居中显示,CSS文字竖排效果且垂直居中水平居中
- C#:C#控件系列四(列表类控件)
- Ugui中使用Image完成动态连线
- ‘EagerTensor‘ object has no attribute ‘reshape‘处理图像数据
- P1102 A-B 数对
- 统计双色球各个数字的中奖概率
热门文章
- php 最长公共子串,PHP实现求解最长公共子串思路方法
- oracle数字加 39,Oracle数据库之SQL单行函数—数字函数-Oracle
- strcpy用于调用的参数太少_JVM:虚拟机方法调用(理解重载和重写的本质)
- html5图片比例控制,按比例调整图像大小以适应HTML5画布
- ftp协议是一种用于_______的协议_网络安全常见协议解析:TCP、UDP、HTTP、FTP、SMTP等之间的区别...
- 应该如何设计圣诞元素到项目?
- 尽显中国风 | 高品质海报背景,PSD分层,智能替换展示商品
- C++数据结构04--顺序栈的实现
- Python--PyQt5.11 + PyCharm安装环境搭建(11.6)
- GCC(-pg) profile mcount | ftrace基础原理