1

我确定我正在以错误的方式使用 FluentValidation,我尝试四处搜索,但可能没有使用正确的术语。任何帮助表示赞赏。

所以,我正在使用一个库,并且因为它处理文件系统,所以我正在模拟它(感谢它有接口,这样我就可以快速做到这一点!)

我试图模拟的对象,它代表一个 excel 工作表,有一个本质上称为“IsEmpty(boolean aBooleanToSet)”的方法。

我可以用 Moq 来写这个:

mockWorkbook.Setup(m => m.IsEmpty(It.IsAny<bool>())).Returns(true);

我的验证器类非常简单,如下所示:

public class InvoiceDetailsWorksheetValidator : AbstractValidator<IXLWorksheet>
{
    public InvoiceDetailsWorksheetValidator()
    {
        RuleFor(x => x.IsEmpty())
            .NotEqual(true).WithMessage("Worksheet must not be empty.");
    }
}

我有以下测试,使用 xUnit.net:

[Fact]
public void Validate_WithFirstWorksheetEmpty_ReturnsInvalid()
{
       // Get the otherwise valid worksheet
       var mockWorkbook = TestHelper.GetMockValidInvoiceDetailsWorksheet();

       // Set the one specific value to a mocked failure
        mockWorkbook.Setup(m => m.IsEmpty(It.IsAny<bool>())).Returns(true);

       // Pass the mock object to the validator
       var validationResults = new InvoiceDetailsWorksheetValidator().Validate(mockWorkbook.Object);

       // Assert that the validator finds it invalid
       Assert.False(validationResults.IsValid);
}

当我运行测试而不是通过测试时,我看到来自 FluentValidation 的以下错误:

System.InvalidOperationException

无法为表达式 x => x.IsEmpty() 自动确定属性名称。
请通过调用“WithName”指定自定义属性名称。

我究竟做错了什么?

4

1 回答 1

1

FluentValidation 的作者Jeremy Skinner在其论坛上为我提供了解释

本质上,FluentValidation 允许您测试方法,但您必须为它们指定属性名称,因为 FluentValidation 天生就是为测试属性而构建的。

所以解决方案是采用我原来的验证:

       RuleFor(x=>x.IsEmpty())
            .NotEqual(true).WithMessage("Worksheet must not be empty.");

...并OverridePropertyName()在末尾添加一个方法,如下所示:

       RuleFor(x=>x.IsEmpty())
            .NotEqual(true).WithMessage("Worksheet must not be empty.").OverridePropertyName("IsEmpty");

(附带说明,如果您需要对业务对象执行验证,我非常推荐这个库。非常方便,很少让我失望,而且 Jeremy 非常擅长支持项目及其用户。)

于 2013-10-01T13:33:44.723 回答