【问题标题】:How to mock a validator for unit testing如何模拟验证器进行单元测试
【发布时间】:2014-11-12 17:45:37
【问题描述】:

我有一个方法可以验证调用外部服务的对象:

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。为什么?我的模拟有什么问题?

【问题讨论】:

    标签: unit-testing mocking moq


    【解决方案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&lt;&gt;

    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());
    

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


    TargetParameterCountException 的原因在您的Returns 语句中,并在here 中得到答复。

    【讨论】:

    • null 问题(可能)已解决。但我现在得到一个反射异常:System.Reflection.TargetParameterCountException: Parameter count mismatch。现在怎么了?我已经设置了 3 个参数,并将 3 个参数发送到模拟的 Validate 函数...:\
    • 如果没有针对该异常或更多代码的调用堆栈,我真的无法说出这可能来自哪里。您发布的代码中的任何内容都不会让我觉得是错误的。
    猜你喜欢
    • 2016-08-12
    • 2011-08-08
    • 2018-04-04
    • 2021-09-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-08-19
    相关资源
    最近更新 更多