TDD Mock validate.ValidateAsync方法

时间:2018-04-26 08:01:31

标签: c# asp.net .net asp.net-mvc fluentvalidation

我编写单元测试,我们有一个方法,通过传递RuleSet名称来调用手动验证。

我无法模仿我的IValidator<RequestObj>.ValidateAsync()方法。

我使用的样本模拟语句

mockValidator.Setup(x => x.ValidateAsync(It.IsAny<SampleRequest>(), It.IsAny<CancellationToken>(), It.IsAny<IValidatorSelector>(), It.IsAny<string>()))
             .ReturnsAsync(new ValidationResult());

我收到以下错误

  

扩展方法的设置无效:x =&gt;   x.ValidateAsync(It.IsAny(),   It.IsAny(),It.IsAny(),   It.IsAny())在   Moq.Mock.ThrowIfSetupExpressionInvolvesUnsupportedMember(表达式   setup,MethodInfo方法)

请告诉我正确的方法。

1 个答案:

答案 0 :(得分:1)

你可以模拟Validate.ValidateAsync。

我收到错误的原因是我试图模拟扩展方法。谁的方法签名

public static Task<ValidationResult> ValidateAsync<T>(this IValidator<T> validator, T instance, CancellationToken cancellationToken = default (CancellationToken), IValidatorSelector selector = null, string ruleSet = null)

但如果你看到它的实现,则调用

validator.ValidateAsync((ValidationContext) validationContext, cancellationToken);

因此,基于上述签名创建Mock可以解决问题。

mockValidator.Setup(x => x.ValidateAsync(It.IsAny<ValidationContext>(), It.IsAny<CancellationToken>()))
                             .ReturnsAsync(new ValidationResult());

如果您想传递验证错误

mockValidator.Setup(x => x.ValidateAsync(It.IsAny<ValidationContext>(), It.IsAny<CancellationToken>()))
                             .ReturnsAsync(new ValidationResult(new List<ValidationFailure>()
                             {
                                 new ValidationFailure("TestField","Test Message"){ErrorCode = "1001"}
                             }));