我编写单元测试,我们有一个方法,通过传递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方法)
请告诉我正确的方法。
答案 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"}
}));