我正在努力让我的 Fluent Validation RuleSet 工作,目前它不起作用,我不知道为什么会发生这种情况,一切似乎都很好。我想以某种方式进入执行验证本身的代码,但 RuleSet lambda 是 ExpressionTree,它不能提供甚至很差的调试体验。
有没有办法调试规则集逻辑以查看规则集内部发生了什么?
FluentValidation 是开源的,因此理论上您可以从 https://github.com/JeremySkinner/FluentValidation 的存储库下载代码,然后加载解决方案,直接引用它,然后单步执行。
希望这能让您到达需要的位置,但我相信如果您提供规则以及一些显示失败的单元测试,这里的人可以提供帮助。
FluentValidation 的当前版本允许您使用
TestValidate
扩展方法对验证器进行单元测试。还有一个异步版本可用。
调用此方法,传递一个对象进行验证,将返回一个
TestValidationResult<>
对象,该对象有 2 个有用的方法 ShouldHaveValidationErrorFor
和
ShouldNotHaveValidationErrorFor
可用于检查测试是否通过或失败。
您可以稍微调试 Fluent Validation。注入验证器后,您可以像这样调试构造函数:
至少你知道你的服务已在 DI 中注册。
Custom
验证器,您也可以在那里放置一个断点,并在调用验证时实际中断。
RuleFor(x => x.InstallLocation.Address.StreetAddress)
.NotEmpty()
.Custom(InstalledAtPhysicalStreetAddress);
提示: 传入您正在验证的实例可能非常有帮助(或有时是必需的)。在您的验证器类构造函数中:
public MyTextClassValidator(MyTextClass myTextClass)
{
RuleFor(x => x.Text)
.MaximumLength(myTextClass.MaximumLength)
.WithMessage("Too Long");
}
如果您在规则上设置断点,则可以确保正在验证的实例包含其期望的内容。
--- 或 ---
如果您有 ReSharper:
AbstractValidator
的类的验证器文件。AbstractValidator
并转到定义 (F12)。 ReSharper 会反编译它。public Task<ValidationResult> ValidateAsync(T instance, CancellationToken cancellation = new())
无法使用 Visual Studio 工具调试 Fluent Validator 代码。 您需要注释要测试的代码的特定部分 (RuleFor)。继续这样做,直到所有规则都经过测试。