[英]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.