【问题标题】:TDD Mock validate.ValidateAsync methodTDD 模拟 validate.ValidateAsync 方法
【发布时间】:2018-04-26 08:01:31
【问题描述】:

我正在编写我的单元测试,我们有方法通过 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 => x.ValidateAsync(It.IsAny(), It.IsAny(), It.IsAny(), It.IsAny()) 在 Moq.Mock.ThrowIfSetupExpressionInvolvesUnsupportedMember(表达式 设置,MethodInfo 方法)

请告诉我正确的方法。

【问题讨论】:

  • “请告诉我正确的方法” - 也许不要使用模拟或至少任何如此复杂的测试代码。 如何测试测试代码?
  • 是的,你不需要模拟,但如果你的验证很复杂,它很方便。

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


【解决方案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"}
                             }));

【讨论】:

  • 正是我想要的,谢谢
猜你喜欢
  • 1970-01-01
  • 2021-11-02
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-01-09
  • 2015-01-23
  • 2011-10-09
相关资源
最近更新 更多