我通过称为“命令”的类运行所有动作.为了说明这一点,要创建一个新用户,我将调用以下代码
new CreateUserCommand(unitOfWork).SetName("Username").SetPassword("Blah").Execute();
我现在正在考虑在此系统中实施验证,以验证诸如密码是一定长度,用户名不是数据库中的重复项之类的东西.
为了解决这个问题,我正在研究使用流利的验证,并为所需的每种类型的实体验证实体创建一个验证类.例如,我会有一个像
public class NewUserValidation : ValidationFor<User>
{
public NewUserValidation()
{
// Validation Rules here
}
}
在自己的类中创建验证的一个优点是,我可以对多个命令使用相同的验证规则(例如,编辑和创建公司可以使用相同的验证规则).
现在,每个验证类将具有与之关联的单元测试.但是,我试图找出如何处理利用这些验证类的命令类的单元测试.
例如,当为命令类创建测试时,我是否会为该类的每个验证规则创建单独的测试(因此,对于每个命令类,我基本上都会为验证类本身复制所有单元测试,因此我计划将相同的验证类用于)?这会产生很多开销,尤其是当我已经知道验证类能够工作的时候,因为它们需要单独的单元测试.
我看到的唯一另一个选择是在包含验证类的命令中公开一个公共属性,然后对单元的验证类是预期的验证类进行单元测试.但是,此方法的问题是我需要设计某种方法来验证Execute()方法是否正在实际运行验证类(否则无法知道是否未运行验证).
我仍然倾向于后者的测试方法,只是为了帮助减少开销,但是我确实需要找到一种解决方案来检查验证是否真正在运行.这会是一个不好的解决方法,我会改用前一种样式吗?
编辑:
为了回答以下两个答案,验证将在Execute()方法的内部通过Execute()实现中的validateator.Validate(entity)调用使用.
虽然我不想违反DRY,但我没有看到一种简单的方法来验证Execute()1)默认情况下使用正确的验证类,以及2)实际上调用验证类的.validate(entity)方法.
我可以通过实例化构造函数中的验证类来解决#1,并通过命令类的公共属性来公开它,但是我不确定如何在不重复单个验证单元测试的情况下正确地对第二个问题进行单元测试.
解决方法:
您已经测试了验证器类的功能.因此,要对这些命令类进行测试的唯一方法是它们实际上使用了验证器.
由于您计划如何使用这些验证器尚不明确,因此很难说如何做到这一点.复制每个命令的测试用例是解决该问题的最无效方法,但是最后,它可能被证明是测试验证器存在的唯一方法.
编辑:从您最近的添加,这看起来像是使用模拟对象的理想人选.
要测试Execute方法,您可以模拟验证器,并验证是否调用了他们的validate方法.要测试命令构造,可以模拟命令对象,并检查是否将适当的验证器传递给它.
您可能要签出this question(*.com).不过,您可能需要仔细设计才能使用模拟框架.
编辑:
也可以看看this question(*.com).看来可以满足您的要求. Microsoft工具Moles(microsoft.com)看起来非常有趣.