我通过称为“命令”的类来运行所有操作。为了说明这一点,要创建一个新用户,我将调用以下代码
new CreateUserCommand(unitOfWork).SetName("Username").SetPassword("Blah").Execute();
我现在正在考虑在这个系统中实现验证,以验证密码是否有一定长度、用户名在数据库中是否重复等...
为了处理这个问题,我正在考虑使用流畅的验证并为我想要的每种类型的实体验证实体创建一个验证类。例如,我会有一个类,例如
public class NewUserValidation : ValidationFor<User>
{
public NewUserValidation()
{
// Validation Rules here
}
}
在自己的类中创建验证的一个优点是我可以对多个命令使用相同的验证规则(例如,编辑和创建公司可能使用相同的验证规则)。
现在,这些验证类中的每一个都会有与之关联的单元测试。但是,我试图弄清楚如何处理使用这些验证类的命令类的单元测试。
例如,在为命令类创建测试时,我是否会为该类的每个验证规则创建单独的测试(因此基本上为我计划使用的每个命令类复制验证类本身的所有单元测试)验证类)?这会产生很多开销,尤其是当我已经知道验证类可以正常工作时,因为对它们进行了单独的单元测试。
我看到的唯一其他选项是在包含验证类的命令中公开一个公共(public)属性,然后我将单元测试该命令的验证类是否是预期的验证类。这个方法的问题是我需要设计一些方法来验证我的 Execute()
方法实际上正在运行验证类(否则没有办法知道是否没有运行验证) .
我仍然倾向于后一种测试方法,只是为了帮助降低开销,但我确实需要找到一种解决方案来检查验证是否实际运行。这会不会是一个糟糕的方法,我是否会更好地改用前一种风格?
编辑: 为了回复下面的两个答案,验证将在
Execute()
方法内部使用,通过 validator.Validate(entity)
调用在 执行()
。
虽然我不想违反 DRY,但我没有看到一种简单的方法来验证 Execute()
1) 默认情况下使用正确的验证类和 2) 实际上调用 .validate(entity)
验证类的方法。
我可以通过在构造函数中实例化验证类来解决#1,并通过命令类的公共(public)属性公开它,但我不确定如何在不重复单个验证单元测试的情况下正确地对第二个问题进行单元测试.
最佳答案
您已经测试了验证器类的功能。因此,对这些命令类进行测试的唯一一件事就是它们实际上使用了验证器。
由于您计划如何使用这些验证器并不明显,所以很难说如何做到这一点。为每个命令复制测试用例是效率最低的方法,但最终,它可能被证明是测试验证器是否存在的唯一方法。
编辑:从您最近添加的内容来看,这看起来是使用模拟对象的完美选择。
要测试 Execute
方法,您可以模拟您的验证器,并验证是否调用了它们的 validate
方法。要测试命令构造,您可以模拟您的命令对象,并检查是否将适当的验证器传递给它。
您可能想查看 this question (stackoverflow.com)。不过,您可能需要调整您的设计,以便可以使用模拟框架。
编辑: 也看看 this question (stackoverflow.com)。它似乎可以满足您的要求。微软工具Moles (microsoft.com) 看起来很有趣。
关于c# - 单元测试一个类使用特定的验证类进行实体验证是否是一种不好的做法?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5385923/