如何模拟验证器进行单元测试

时间:2014-11-12 17:45:37

标签: unit-testing mocking moq

我有一个验证Object调用外部服务的方法:

public void Validate(IValidator<MyType> validator)
{
    IMapper<MyType> mapper = new MyTypeMapper();
    foreach (var element in this.Elements)
    {
        ValidationResult result = validator.Validate(myTypeInstance, mapper, new ValidationConfiguration());

        if (result.IsValid)
            // do something
        else
            // do something else
     }
}

现在我的单元测试中有一系列元素。我希望如果一个元素具有给定的id号,Validate方法应返回另一个带有验证消息的存根:

// arrange
var myAggregate aggregate = ElementsNonValidated.Stub();
var mockedValidator = new Mock<IValidator<MyType>>();

mockedValidator.Setup(a => a.Validate(
                 It.Is<Mytype>(x => x.Id == Guid.Parse("3F2504E0-4F89-11D3-9A0C-0305E82C3301")),
                 new Mapper(),
                 new ValidationConfiguration()
                )).Returns<ValidationResult>(x => x = new ValidationResult());

// act
myAggregate.Valida(mockedValidator.Object);

问题是:当单元测试开始并且直到真实方法验证仍然返回result=null时。为什么?我的模拟有什么问题?

1 个答案:

答案 0 :(得分:1)

问题在于:

mockedValidator.Setup(a => a.Validate(
             It.Is<Mytype>(x => x.Id == Guid.Parse("3F2504E0-4F89-11D3-9A0C-0305E82C3301")),
             new Mapper(), 
             new ValidationConfiguration()
            )).Returns<ValidationResult>(x => x = new ValidationResult());

您设置Validate以期望特定的MapperValidationResult实例,这当然与您测试的系统中使用的实例不匹配。如果您不关心参数应该使用哪个实例,请使用It.IsAny<>

mockedValidator.Setup(a => a.Validate(
             It.Is<Mytype>(x => x.Id == Guid.Parse("3F2504E0-4F89-11D3-9A0C-0305E82C3301")),
             It.IsAny<Mapper>(), 
             It.IsAny<ValidationConfiguration>()
            )).Returns<ValidationResult>(x => x = new ValidationResult());

这将为ValidationResult的任何和每次调用返回一个新的Validate,其中对象的Id等于该特定的GUID。


TargetParameterCountException的原因在于您的Returns声明,并已回复here

相关问题