簡體   English   中英

具有子/子類的類的單元測試 FluentValidation 規則

[英]Unit testing FluentValidation rules for classes with sub/child classes

當我們正在驗證的對象具有也正在驗證的子類時,是否可以為 fluentvalidation 類編寫單元測試。

例如:我的班級看起來像這樣

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 : Object reference not set to an instance of an object”。 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:對象與目標類型不匹配”。 來自FluentValidation.TestHelper.ValidatorTester`2.ValidateError(T instanceToValidate)

您可以對模型和子模型進行單元測試,但您需要更改驗證類以使用單獨的驗證器類來驗證子模型:

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);
    }
}

然后,您可以編寫單元測試來測試每個驗證器或同時測試兩者。

我得出的結論是,對於這個 ShouldHaveValidationErrorFor 無法處理子類,所以不得不手動進行。 IE

    [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"));
    }

使用 MSTest 和 FluentAssertions,您可以編寫

[TestMethod]
public void Should_have_error_when_val_is_zero()
{
    // Given
    var validator = new TestModelValidator();
    var testModel = TestModel
    {
        ParentVal = 0
    }; // You should create a invalid TestModel object here

    // When
    validator.Validate(testModel).IsValid.Should().BeFalse();
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM