9

検証中のオブジェクトに検証中の子クラスがある場合、流暢な検証クラスの単体テストを作成することは可能ですか?

例として:私のクラスは次のようになります

public class TestModel
{

    public class SubData
    {
        public int SubDataVal { get; set; }
    }

    public int ParentVal { get; set; }
    public SubData Sub { get; set; }

}

私の検証ロジックは次のようになります。

public class TestModelValidator : AbstractValidator<TestModel>
{
    public TestModelValidator()
    {
        RuleFor(o => o.ParentVal).GreaterThan(0);
        RuleFor(o => o.Sub.SubDataVal).GreaterThan(0);
    }
}

そして、次の単体テストを書くと

    [Test]
    public void Should_have_error_when_val_is_zero()
    {
        validator = new TestModelValidator();
        validator.ShouldHaveValidationErrorFor(model => model.ParentVal, 0);
    }

「System.NullReferenceException : オブジェクト参照がオブジェクトのインスタンスに設定されていません」というメッセージが表示されます。FluentValidation.TestHelper.ValidatorTester`2.ValidateError(T instanceToValidate)からの例外

( RuleFor(o => o.Sub.SubDataVal).GreaterThan(0);行を削除すると、機能します!)

同様に、実際の子クラスを単体テストしようとすると、次のようになります。

    [Test]
    public void Should_have_error_when_sub_dataVal_is_zero()
    {
        validator = new TestModelValidator();
        validator.ShouldHaveValidationErrorFor(model => model.Sub.SubDataVal, 0);
    }

「System.Reflection.TargetException : オブジェクトがターゲット タイプと一致しません」というメッセージが表示されます。from FluentValidation.TestHelper.ValidatorTester`2.ValidateError(T instanceToValidate)

4

3 に答える 3

9

モデルと子モデルを単体テストできますが、検証クラスを変更して、子モデルのみを検証する別のバリ​​データー クラスを使用する必要があります。

public class TestModelValidator : AbstractValidator<TestModel>
{
    public TestModelValidator()
    {
        RuleFor(o => o.ParentVal).GreaterThan(0);
        RuleFor(o => o.Sub).SetValidator(new SubDataValidator());
    }
}

public class SubDataValidator : AbstractValidator<SubData>
{
    public SubDataValidator()
    {
        RuleFor(o => o.SubDataVal).GreaterThan(0);
    }
}

次に、単体テストを記述して、各バリデーターまたは両方を一緒にテストできます。

于 2012-12-23T17:11:49.217 に答える
6

このため、ShouldHaveValidationErrorFor はサブクラスを処理できないという結論に達したため、手動で処理することに頼りました。すなわち

    [Test]
    public void Should_have_error_when_val_is_zero()
    {
        validator = new TestModelValidator();
        TestModel testRequest = new TestModel();
        //populate with dummy data
        var result = validator.Validate(testRequest);
        Assert.That(result.Errors.Any(o => o.PropertyName== "ParentVal"));
    }
于 2012-12-18T11:54:08.777 に答える