调试流畅的验证规则

问题描述 投票:0回答:5

问题

我正在努力让我的 Fluent Validation RuleSet 工作,目前它不起作用,我不知道为什么会发生这种情况,一切似乎都很好。我想以某种方式进入执行验证本身的代码,但 RuleSet lambda 是 ExpressionTree,它不能提供甚至很差的调试体验。

问题

有没有办法调试规则集逻辑以查看规则集内部发生了什么?

asp.net-mvc debugging asp.net-mvc-4 fluentvalidation
5个回答
3
投票

FluentValidation 是开源的,因此理论上您可以从 https://github.com/JeremySkinner/FluentValidation 的存储库下载代码,然后加载解决方案,直接引用它,然后单步执行。

希望这能让您到达需要的位置,但我相信如果您提供规则以及一些显示失败的单元测试,这里的人可以提供帮助。


2
投票

FluentValidation 的当前版本允许您使用

TestValidate
扩展方法对验证器进行单元测试。还有一个异步版本可用。

调用此方法,传递一个对象进行验证,将返回一个

TestValidationResult<>
对象,该对象有 2 个有用的方法
ShouldHaveValidationErrorFor
ShouldNotHaveValidationErrorFor
可用于检查测试是否通过或失败。

可以在此处找到文档https://docs.fluidation.net/en/latest/testing.html


2
投票

可以稍微调试 Fluent Validation。注入验证器后,您可以像这样调试构造函数:

至少你知道你的服务已在 DI 中注册。

如果您有

Custom
验证器,您也可以在那里放置一个断点,并在调用验证时实际中断。

RuleFor(x => x.InstallLocation.Address.StreetAddress)
    .NotEmpty()
    .Custom(InstalledAtPhysicalStreetAddress);


0
投票

提示: 传入您正在验证的实例可能非常有帮助(或有时是必需的)。在您的验证器类构造函数中:

public MyTextClassValidator(MyTextClass myTextClass)
{
    RuleFor(x => x.Text)
    .MaximumLength(myTextClass.MaximumLength)
    .WithMessage("Too Long");
}

如果您在规则上设置断点,则可以确保正在验证的实例包含其期望的内容。

--- 或 ---

如果您有 ReSharper:

  1. 打开具有继承自
    AbstractValidator
    的类的验证器文件。
  2. 右键单击
    AbstractValidator
    并转到定义 (F12)。 ReSharper 会反编译它。
  3. 在反编译的类中,找到您的方法调用并添加断点。例如在
    public Task<ValidationResult> ValidateAsync(T instance, CancellationToken cancellation = new())
  4. 处添加断点
  5. 开始调试。
  6. 确保为 FluentValidation.dll 加载符号
    • 调试菜单 -> 窗口 -> 模块
    • 搜索 FluentValidation.dll
    • 右键单击它并选择使用 ReSharper Decompiler 加载符号


-1
投票

无法使用 Visual Studio 工具调试 Fluent Validator 代码。 您需要注释要测试的代码的特定部分 (RuleFor)。继续这样做,直到所有规则都经过测试。

© www.soinside.com 2019 - 2024. All rights reserved.