Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/316.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 单元测试类使用特定的验证类进行实体验证是一种不好的做法吗?_C#_Unit Testing_Validation_Tdd - Fatal编程技术网

C# 单元测试类使用特定的验证类进行实体验证是一种不好的做法吗?

C# 单元测试类使用特定的验证类进行实体验证是一种不好的做法吗?,c#,unit-testing,validation,tdd,C#,Unit Testing,Validation,Tdd,我通过我称之为“commands”的类运行所有操作。为了说明这一点,为了创建一个新用户,我将调用以下代码 new CreateUserCommand(unitOfWork).SetName("Username").SetPassword("Blah").Execute(); 我现在正在考虑在这个系统中实现验证,以验证密码是否有一定的长度,用户名是否在数据库中重复等 为了解决这个问题,我正在考虑使用fluent验证,并为我想要的每种类型的实体验证实体创建一个验证类。例如,我将有一个类,如 pub

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

new CreateUserCommand(unitOfWork).SetName("Username").SetPassword("Blah").Execute();
我现在正在考虑在这个系统中实现验证,以验证密码是否有一定的长度,用户名是否在数据库中重复等

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

public class NewUserValidation : ValidationFor<User>
{
   public NewUserValidation() 
   {
     // Validation Rules here
   }
}
public类NewUserValidation:ValidationFor
{
公共NewUserValidation()
{
//此处的验证规则
}
}
在自己的类中创建验证的一个优点是,我可以对多个命令使用相同的验证规则(例如,编辑和创建公司可能使用相同的验证规则)

现在,这些验证类中的每一个都有与之相关联的单元测试。但是,我正在试图找出如何处理使用这些验证类的命令类的单元测试

例如,在为命令类创建测试时,我是否会为该类的每个验证规则创建单独的测试(从而基本上为我计划使用相同验证类的每个命令类复制验证类本身的所有单元测试)?这会造成很大的开销,特别是当我已经知道验证类是通过单独的单元测试工作的时候

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

我仍然倾向于后一种测试方法,只是为了帮助降低开销,但我确实需要找到一个解决方案来检查验证是否实际运行。这是不是一种不好的方式,我会选择前一种方式吗


编辑: 要回答下面的两个答案,验证将在
Execute()
方法内部使用,由
验证器使用。在
Execute()
的实现中,验证(实体)
调用

虽然我不想违反DRY,但我看不到一种简单的方法来验证
Execute()
1)是否默认使用了正确的验证类,以及2)是否实际调用了验证类的
.validate(entity)
方法


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

您已经测试了验证程序类的功能。因此,在这些命令类上测试的唯一一件事是它们实际上使用了验证器

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


编辑:从您最近添加的内容来看,这似乎是使用模拟对象的完美候选

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

您可能想退房(stackoverflow.com)。不过,您可能需要改进您的设计,以便可以使用模拟框架


编辑:
也可以看看(stackoverflow.com)。它似乎满足了你的要求。Microsoft工具(Microsoft.com)看起来非常有趣。

您几乎不想违反DRY,因此我认为重复每个引用类的单元测试是绝对错误的。我真的不理解您对验证Execute方法是否正在运行验证类的担心。这不应该是Execute方法的单元测试吗?一旦您测试了它,为什么您需要专门针对每种类型的验证类进行测试

最后,我不确定您为什么需要“测试命令的验证类是否是预期的验证类”。听起来您是在测试工厂,而不是实际的命令类


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

如果我是你,我只会创建一个validationfallingtest,在那里你用无效数据执行一个命令


此测试表明该命令具有有效性验证。在我看来,验证是否存在验证类的正确实例在很大程度上取决于实现。

同意:测试工厂。如果您正在测试是否选择了正确的验证器对象,则需要为负责执行此操作的factory对象编写单元测试。如果你的命令对象负责创建他们自己的验证器,考虑分开Outtok我明白你的意思!我的设计需要稍作修改,但您建议我如何允许单元测试通过验证类?我看到的问题是,单元测试将不得不修改命令的验证类(给它一个模拟类),但在单元测试之外,验证对象将被修改