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 に答える