我有一个验证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
时。为什么?我的模拟有什么问题?
答案 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
以期望特定的Mapper
和ValidationResult
实例,这当然与您测试的系统中使用的实例不匹配。如果您不关心参数应该使用哪个实例,请使用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。