【问题标题】:Use FluentValidation to verify a mocked function result?使用 FluentValidation 验证模拟函数结果?
【发布时间】:2013-10-01 21:33:44
【问题描述】:

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

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

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

我可以用最小起订量来写这个:

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”指定自定义属性名称。

我做错了什么?

【问题讨论】:

    标签: c# moq fluentvalidation


    【解决方案1】:

    Jeremy Skinner,FluentValidation 的作者,很乐意为我提供an explanation on its discussion forum

    从本质上讲,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 非常擅长支持项目及其用户。)

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-04-17
      • 2020-01-08
      • 2023-03-21
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多