2012-01-26 2 views
3

FluentValidation.TestHelper名前空間の拡張メソッド.ShouldHaveChildValidator()には、モデルをとるオーバーロードはありません。次の例のように、When()句を使用すると、子バリデーターが正しく設定されていることをテストするにはどうすればよいですか?FluentValidation.TestHelperを使用してWhen()条件を使用してテストの子バリデータをユニット化する方法

など。

public class ParentModel 
{ 
    public bool SomeCheckbox { get; set; } 

    public ChildModel SomeProperty { get; set; } 
} 

public class ParentModelValidator : AbstractValidator<ParentModel> 
{ 
    RuleFor(m => m.SomeProperty) 
      .SetValidator(new ChildModelValidator()) 
      .When(m => m.SomeCheckbox); 
} 

私はSomeCheckboxがtrueの場合、子のバリデータが存在し、SomeCheckboxがfalseの場合、子のバリデータが存在しないことをアサートします。

は私が持っているこれまでのユニットテストでは、以下:

ParentModelValidator validator = new ParentModelValidator(); 
validator.ShouldHaveChildValidator(
    m => m.SomeProperty, 
    typeof(ChildModelValidator)); 

をそれが.When()条件を考慮していません。

FluentValidation.TestHelper名前空間の他のメソッド、たとえば.ShouldHaveValidationErrorFor()にはモデルが必要なオーバーロードがあるので、When()句を使用して簡単なプロパティタイプをテストするのは簡単です前提条件

アイデア?ここで

+0

あり、その後、溶液がいいだろう。 – TuomasK

答えて

2

は、私はこれを達成する方法の抜粋です:

public class ParentModelSimpleValidator : AbstractValidator<ParentModel> 
{ 
    public ParentModelSimpleValidator() 
    { 
     When(x => x.HasChild,() => 
      RuleFor(x => x.Child) 
       .SetValidator(new ChildModelSimpleValidator())); 
    } 
} 

public class ChildModelSimpleValidator : AbstractValidator<ChildModel> 
{ 
    public ChildModelSimpleValidator() 
    { 
     RuleFor(x => x.ChildName) 
      .NotEmpty() 
      .WithMessage("Whatever"); 
    } 
} 

は、ここで関連する単純化したモデルです。

[Validator(typeof(ParentModelSimpleValidator))] 
public class ParentModel 
{ 
    public bool HasChild { get { return Child != null; } } 
    public ChildModel Child { get; set; } 
} 

[Validator(typeof(ChildModelSimpleValidator))] 
public class ChildModel 
{ 
    public string ChildName { get; set; } 
    public int? ChildAge { get; set; } 
} 

は、ここでサンプルユニットテストです:

[TestMethod] 
public void ShouldValidateChildIfParentHasChild() 
{ 
    var validator = new ParentModelSimpleValidator(); 

    var model = new ParentModel 
    { 
     ParentName = "AABBC", 
     Child = new ChildModel { ChildName = string.Empty } 
    }; 

    validator.ShouldHaveErrorMessage(model, "Whatever"); 
} 
1

非常に遅くまでここにゲームがありますが、私はちょうどFluentValidationを使い始めました。それが私の解決策でした。

public class ParentValidator: AbstractValidator<ParentModel> 
    { 
    public ParentValidator() 
    { 
     // other rules here 

     // use == for bool? 
     When(model => model.SomeBoolProperty == false,() => RuleFor(model => model.ChildClass).SetValidator(new ChildClassValidator())); 
    } 
    } 

    public class ChildClassValidator: AbstractValidator<ChildClass> 
    { 
    public ChildClassValidator() 
    { 
     this 
     .RuleFor(model => model.SomeProperty).NotNull(); 
    } 
    } 

テストは、私は正確に同じ問題を抱えている

[TestMethod] 
public void ParentValidator_should_have_error_in_child_class_property_when_bool_is_false_on_parent() 
{ 
    // Arrange - API does not support typical unit test 
    var validator = new ParentValidator() 
    var foo = new ParentModel() { SomeBoolProperty = false }; 
    foo.ChildClass.SomeProperty = null; 

    // Act 
    var result = validator.Validate(foo); 

    // Assert - using FluentAssertions 
    result.Errors.Should().Contain(err => err.PropertyName == "ChildClass.SomeProperty"); 
} 
関連する問題