首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >问答首页 >如果一个类使用特定的验证类来进行实体验证,那么单元测试是否是一个糟糕的实践呢?

如果一个类使用特定的验证类来进行实体验证,那么单元测试是否是一个糟糕的实践呢?
EN

Stack Overflow用户
提问于 2011-03-21 18:00:06
回答 3查看 579关注 0票数 3

我通过我称之为“命令”的类运行我的所有操作。为了说明这一点,为了创建一个新用户,我将调用以下代码

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
new CreateUserCommand(unitOfWork).SetName("Username").SetPassword("Blah").Execute();

我现在正在考虑在这个系统中实现验证,以验证一些事情,比如密码有一定的长度,用户名不是数据库中的副本,等等。

为了处理这个问题,我正在考虑使用fluent验证,并为我想要的每种类型的实体验证实体创建一个验证类。例如,我将有一个类,如

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
public class NewUserValidation : ValidationFor<User>
{
   public NewUserValidation() 
   {
     // Validation Rules here
   }
}

在它自己的类中创建验证的一个优点是,我可以对多个命令使用相同的验证规则(例如,编辑和创建公司可能使用相同的验证规则)。

现在,这些验证类中的每一个都有与它们相关联的单元测试。然而,我正试图弄清楚如何处理使用这些验证类的命令类的单元测试。

例如,在为命令类创建测试时,我是否会为该类的每个验证规则创建单独的测试(因此基本上重复了我计划对每个命令类使用相同验证类的验证类本身的所有单元测试)?这造成了大量的开销,特别是当我已经知道验证类可以工作时,这是因为它们需要单独的单元测试。

我看到的唯一其他选项是在包含验证类的命令中公开一个公共属性,然后单元测试命令的验证类是预期的验证类。但是,这个方法的问题在于,我需要设计一些方法来验证我的Execute()方法是否实际运行了验证类(否则,无法知道是否没有运行验证)。

我仍然倾向于后一种测试方法,这只是为了减少开销,但我确实需要找到一个解决方案来检查验证是否实际运行。这会不会是一个不好的方式去做它,我会更好地选择以前的风格而不是?

编辑:为了回答下面的两个答案,验证将在Execute()方法的内部使用,在Execute()的实现中使用一个validator.Validate(entity)调用。

虽然我不想违反and,但我看不到一种简单的方法来验证Execute() 1)默认使用正确的验证类,而2)实际上调用验证类的.validate(entity)方法。

我可以通过在构造函数中实例化验证类来解决#1,并通过命令类的公共属性公开它,但我不知道如何在不重复单个验证单元测试的情况下正确地对第二个问题进行单元测试。

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2011-03-21 18:22:46

您已经测试了验证器类的功能。因此,对这些命令类进行测试的唯一方法是,它们实际上使用了验证器。

由于您计划如何使用这些验证器并不明显,因此很难说这是如何做到的。复制每个命令的测试用例是最不有效的方法,但最终,它可能是测试验证器存在的唯一方法。

编辑:从您最近的添加,这看起来是一个完美的候选人使用模拟对象。

要测试Execute方法,可以模拟验证器,并验证它们的validate方法是否被调用。要测试命令结构,可以模拟命令对象,并检查是否将适当的验证器传递给它。

您可能需要查看这个问题 (stackoverflow.com)。不过,您可能需要修改您的设计,以便使用模拟框架。

编辑:还可以看看这个问题 (stackoverflow.com)。它似乎满足了您的需求。微软工具鼹鼠 (microsoft.com)看起来非常有趣。

票数 2
EN

Stack Overflow用户

发布于 2011-03-21 18:23:30

你几乎从来不想违反DRY,所以我认为重复每个引用类的单元测试是绝对错误的。我不太理解您对于验证Execute方法是否运行验证类的关注。这不应该是执行方法的单元测试吗?一旦您测试了它,为什么需要专门针对每种类型的验证类进行测试呢?

最后,我不知道为什么需要“测试命令的验证类是预期的验证类”。听起来像是在测试一个工厂,而不是实际的Command类。

我只测试命令类直接负责的单元测试。如果Command类创建了它引用的自己的验证类,那么我想您可以对它进行单元测试。但根据你提供的信息,这听起来不太对。

票数 1
EN

Stack Overflow用户

发布于 2011-03-22 00:26:04

如果我是您,我将创建,只创建一个validationFalingTest,其中执行一个包含无效数据的命令。

此测试允许命令具有工作验证。在我看来,验证类的正确实例在很大程度上是特定于实现的。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/5385923

复制
相关文章
5.1 汇编语言:汇编语言概述
汇编语言是一种面向机器的低级语言,用于编写计算机程序。汇编语言与计算机机器语言非常接近,汇编语言程序可以使用符号、助记符等来代替机器语言的二进制码,但最终会被汇编器编译成计算机可执行的机器码。
微软技术分享
2023/08/22
4160
5.1 汇编语言:汇编语言概述
汇编语言是一种面向机器的低级语言,用于编写计算机程序。汇编语言与计算机机器语言非常接近,汇编语言程序可以使用符号、助记符等来代替机器语言的二进制码,但最终会被汇编器编译成计算机可执行的机器码。
微软技术分享
2023/10/11
6390
代码还原,IDA中使用的宏
如果想使用,直接去IDA的plugins插件目录下.包含它的 **defs.h"" 如下:
IBinary
2019/05/25
5.1K0
Sword To Offer 064 - 滑动窗口的最大值
给定一个数组和滑动窗口的大小,找出所有滑动窗口里数值的最大值。例如,如果输入数组{2,3,4,2,6,2,5,1}及滑动窗口的大小3,那么一共存在6个滑动窗口,他们的最大值分别为{4,4,6,6,6,5}; 针对数组{2,3,4,2,6,2,5,1}的滑动窗口有以下6个: {[2,3,4],2,6,2,5,1}, {2,[3,4,2],6,2,5,1}, {2,3,[4,2,6],2,5,1}, {2,3,4,[2,6,2],5,1}, {2,3,4,2,[6,2,5],1}, {2,3,4,2,6,[2,5,1]}。
Reck Zhang
2021/08/11
2220
[DCC Error] E2161 Error: RLINK32: Unsupported 16bit resource in file “.dfm”
Delphi程序的郁闷之处就在于各种第三方的库处理起来太麻烦了,总是有人喜欢引入一些从来没见过的东西,于是编译的时候就变得非常蛋疼,不是库不好找而是不同的版本导致出现各种错误。比如alphacontrols这个鸟插件就测试了n个版本。其实这个不是最蛋疼的,最蛋疼的是处理完了所有的错误之后编译出现问题了:[DCC Error] E2161 Error: RLINK32: Unsupported 16bit resource in file “.dfm”
obaby
2023/02/23
5580
ubuntu 出现GPG Error的问题[通俗易懂]
错误提示:gpg error the public key is not available no_pubkey 5523BF*********
全栈程序员站长
2022/11/04
1K0
使用Androidkiller或APKIDE编译APK文件时出现libpng error: Not a PNG file的错误
>W: libpng error: Not a PNG file >W: ERROR: Failure processing PNG image D:\xin\AndroidKiller_v1.3.12018\projects\CFF_100\Project\res\mipmap-xxhdpi-v4\ic_launcher.png
全栈程序员站长
2022/11/17
4.4K0
使用Androidkiller或APKIDE编译APK文件时出现libpng error: Not a PNG file的错误
Sword To Offer 037 - 数字在排序数组中出现的次数
数字在排序数组中出现的次数 Desicription 统计一个数字在排序数组中出现的次数。 Solution class Solution { public: int GetNumberOfK(const vector<int>& data ,int k) { return upper_bound(data.begin(), data.end(), k) - lower_bound(data.begin(), data.end(), k); } };
Reck Zhang
2021/08/11
2450
Sword To Offer 040 - 数组中只出现一次的数字
一个整型数组里除了两个数字之外,其他的数字都出现了两次。请写程序找出这两个只出现一次的数字。
Reck Zhang
2021/08/11
3160
Sword To Offer 028 - 数组中出现次数超过一半的数字
数组中有一个数字出现的次数超过数组长度的一半,请找出这个数字。例如输入一个长度为9的数组{1,2,3,2,2,2,5,4,2}。由于数字2在数组中出现了5次,超过数组长度的一半,因此输出2。如果不存在则输出0。
Reck Zhang
2021/08/11
2130
integer类型比较大小_pow的值的数据类型
MySQL支持SQL标准整数类型 INTEGER(或 INT)和SMALLINT。作为标准的扩展,MySQL还支持整数类型 TINYINT、MEDIUMINT 和 BIGINT。下表显示了每个整数类型所需的存储和范围。.
全栈程序员站长
2022/10/29
7410
masm nasm的全局变量
这样就可以在c 或 其他asm中使用了 public _ghook,gvm .data _ghook: TIHooKing <> gvm: dq 0 比如:masm中语法 .data extern _gvm:dword extern SPMagiCode:dword c中语法: extern int _test; nasm中语法: .global studentID .data studentID: .word 12345678
战神伽罗
2019/07/24
1.2K0
nginx设置header如果没有值
map 指令是由 ngx_http_map_module 模块提供的,默认情况下安装 nginx 都会安装该模块。
十毛
2022/08/23
1.4K0
nginx设置header如果没有值
如何找出单向链表中每个节点之后的下个较大值?
1. 要找到的是一个元素之后下个较大值,这里的关键词是[下个较大值]是其后第一个大于当前元素的值.如例子中,第二个元素4(list[1])对应的下个较大值应为5,而不是8.
一个架构师
2022/06/20
1.1K0
如何找出单向链表中每个节点之后的下个较大值?
制作通过 NuGet 分发的源代码包时,如果目标项目是 WPF 则会出现一些问题(探索篇,含解决方案)
在使用 NuGet 包来分发源代码时,如果目标项目是 WPF 项目,那么会有一大堆的问题。
walterlv
2023/10/22
4910
制作通过 NuGet 分发的源代码包时,如果目标项目是 WPF 则会出现一些问题(探索篇,含解决方案)
宝塔部署Django出现Internal Server Error
打开程序目录下的uwsgi.ini,修改wsgi-file为你的Django,app下的wsgi.py
SingYi
2022/07/14
1.7K0
宝塔部署Django出现Internal Server Error
汇编debug与masm命令
汇编语言这块是我之前写在网易博客上的,不过那个账号基本已经作废了,所以现在抽个时间把当时的博客搬到CSDN上。 汇编命令(编译器masm命令):找到masm所在的文件夹,我的在d:\MASM中,用cmd打开dos界面,输入“d:”切换到D盘,再输入“d:\MASM\masm”打开编译器中的masm程序得到如下结果:
Masimaro
2019/02/25
1.5K0
Sword To Offer 034 - 第一个只出现一次的字符
在一个字符串(1<=字符串长度<=10000,全部由字母组成)中找到第一个只出现一次的字符,并返回它的位置
Reck Zhang
2021/08/11
2850
null或空值的判断处理
1,错误用法一: if (name == "") {      //do something } 2,错误用法二: if (name.equals("")) {      //do something } 3,错误用法三: if (!name.equals("")) {      //do something } 我们来解说一下: 上述错误用法1是初学者最容易犯,也最不容易被发现的错误,因为它们的语法本身没问题,Java编译器编译时不报错。但这种条件可能在运行时导致程序出现bug,永远也不会为true,也就是时说,if块里的语句永远也不会被执行。 上述用法二,用法三 的写法,是包括很多Java熟手也很容易犯的错误,为什么是错误的呢?也许你会感到纳闷。 对,它们的写法本身没错,但是,少了一个null判断的条件,试想,如果name=null的情况下,会发生什么后果呢?后果是,你的程序将抛出NullPointerException异常,系统将被挂起,不再提供正常服务。 当然,如果之前已经对name作了null判断的情况例外。 正确的写法应该先加上name != null的条件,如例: if (name != null && !name.equals("")) {      //do something } 或者 if (!"".equals(name)) {//将""写在前头,这样,不管name是否为null,都不会出错。      //do something } 下面,我们举一个简单的例子: TestNullOrEmpty.java
似水的流年
2019/12/08
3.4K0
点击加载更多

相似问题

无法连接本地主机上的动物园管理员:2181

10

卡夫卡动物园管理员连接问题

316

卡夫卡和动物园管理员TLS

14

其他信息系统如何处理卡夫卡动物园管理员解决的问题?

10

卡夫卡和动物园管理员家属

10
添加站长 进交流群

领取专属 10元无门槛券

AI混元助手 在线答疑

扫码加入开发者社群
关注 腾讯云开发者公众号

洞察 腾讯核心技术

剖析业界实践案例

扫码关注腾讯云开发者公众号
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
查看详情【社区公告】 技术创作特训营有奖征文