c# - 如何模拟使用规则集的 AbstractValidator?

标签 c# moq fluentvalidation

我有一个抽象验证器,结构如下:

public abstract class RiskAssessmentServiceCreateRequestValidator<T>
    : AbstractValidator<T> where T
        : IRiskAssessmentServiceCreateRequest
{
    public RiskAssessmentServiceCreateRequestValidator(ApplicationContext context)
    {
        RuleSet("modelBinding", () =>
        {
            RuleFor(x => x.ServiceProviderId).NotNull().GreaterThan(0);
        });

        RuleSet("handler", () =>
        {
            //....
        });

    }
}

在我的请求处理程序中,我正在调用此类的派生实例:

var validationResult = _validator.Validate(request, ruleSet: "handler");

如何在单元测试中模拟对 Validate 的特定调用?如果我不使用规则集,我的设置将如下所示:

_validator.Setup(x => x.Validate(It.IsAny<CreateRequest>()))
          .Returns(validationResult);

不允许以下调用,因为表达式树中不允许有可选参数:

_validator.Setup(x => x.Validate(
                It.IsAny<CreateRequest>(), 
                ruleSet: It.IsAny<string>()))
          .Returns(validationResult);

理论上我可以这样设置:

_validator.Setup(x => x.Validate(
                It.IsAny<CreateRequest>(), 
                (IValidatorSelector)null,
                It.IsAny<string>()))
           .Returns(validationResult);

但这会导致:

System.NotSupportedException : Unsupported expression: x => x.Validate<CreateRequest>(It.IsAny<CreateRequest>(), null, It.IsAny<string>())
    Extension methods (here: DefaultValidatorExtensions.Validate) may not be used in setup / verification expressions.

除了使用我想避免的真实验证器之外,我该如何解决这个问题并以合适的方式设置起订量?

最佳答案

这里确实有两个问题。

  1. 首先是如何使用可选参数进行模拟 - 简单地将可选参数视为非可选。

  2. 但是,您正在尝试模拟扩展方法,这是不可能的。相反,您需要模拟扩展试图调用的方法。粗略浏览一下源代码,我认为它在调用 validator.Validate(ValidationContext)。所以你的最小起订量代码可能是这样的:

    _validator
        .Setup(x => x.Validate(It.IsAny<ValidationContext<CreateRequest>>())
        .Returns(validationResult);
    

关于c# - 如何模拟使用规则集的 AbstractValidator?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60712223/

相关文章:

c# - 如何自动添加gridview单元格

c# - 将数字与整数分开(无字符串函数)

asp.net-mvc - 单元测试帐户 MVC Controller 错误 - 仍在使用真正的 MembershipService

c# - 如何使用 MOQ 库模拟一个 ENum

javascript - 在创建不显示错误消息的部分 View 的集合上使用 FluentValidation

c# - 我应该允许不对称的平等吗?

c# - 验证未在自定义验证器中调用

c# - FluentValidation 和 Entity Framework 查找

c# - 从数据库 Linq 获取最小值和最大值到 MVC 中的 Sql 查询?