2014-06-11 12 views
9

È possibile eseguire il test di una FluentValidation PropertyValidator in isolamento?Test FluentValidation PropertyValidator

So che posso testare il Validator che utilizza lo PropertyValidator per errori specifici, ma preferisco testare true/false solo sul validatore di proprietà, se possibile.

Questo può essere fatto? Se é cosi, come?

+1

@wonea revisione del [test disponibile] (https://github.com/JeremySkinner/FluentValidation/blob/master/src/FluentValidation.Tests/PropertyValidatorTester.cs) nel [sito del progetto] (https://github.com) /JeremySkinner/FluentValidation/tree/master/src/FluentValidation.Tests) mostra che le risposte qui fornite corrispondono a ciò che il proprietario utilizza per testare la fonte. – Nkosi

+0

@wonea e in base ai timestamp sui test pertinenti non sono cambiati negli ultimi 2 anni almeno. – Nkosi

risposta

8

Volevo anche testare la mia vera/falsa logica. È un vero peccato che il metodo IsValid sia protetto. Il mio compito era creare un altro metodo IsValid e avere la chiamata IsValid protetta ad esso.

public class MyValidator: PropertyValidator 
{ 
    public MyValidator(
     string errorMessage = "default Message") : base(errorMessage) 
    { 
    } 

    protected override bool IsValid(PropertyValidatorContext context) 
    { 
     var stringToValidate = context.PropertyValue as String; 
     return IsValid(stringToValidate); 
    } 

    public bool IsValid(string stringToValidate) 
    { 
     if (stringToValidate == null) 
     { 
      return false; 
     } 

     //testing logic here 
     return true; 
    } 
} 
+0

Cheers Rich, speravo che ci fosse un altro modo che non implicava una soluzione, ma questo mi darà quello di cui ho bisogno. Grazie ancora :) – Jamez

5

So che questo è stato un po ', ma ho ottenuto questo come segue:

personalizzata Validator:

public class MyValidator : PropertyValidator 
{ 
    public MyValidator() 
     : base("Value must be null or between 0 and 3.") 
    { 
    } 

    protected override bool IsValid(PropertyValidatorContext context) 
    { 
     if (context.PropertyValue == null) 
     { 
      return true; 
     } 

     var value = (decimal)context.PropertyValue; 
     return value >= 0m && value <= 3m; 
    } 
} 

prova Validator:

public class TestValidator : InlineValidator<TestObject> 
{ 
    public TestValidator (params Action<TestValidator >[] actions) 
    { 
     foreach (var action in actions) 
     { 
      action(this); 
     } 
    } 
} 

Oggetto di prova:

public class TestObject 
{ 
    public TestObject(decimal? val) 
    { 
     this.GenericDecimal = val; 
    } 

    public decimal? GenericDecimal { get; set; } 
} 

prova:

[Test] 
public void TestIt() 
{ 
    var validator = new TestValidator(v => v.RuleFor(obj => obj.GenericDecimal).SetValidator(new MyValidator())); 

    Assert.IsTrue(validator.Validate(new TestObject(null)).IsValid);  
    Assert.IsTrue(validator.Validate(new TestObject(0m)).IsValid); 
    Assert.IsTrue(validator.Validate(new TestObject(3m)).IsValid); 
    Assert.IsFalse(validator.Validate(new TestObject(-1m)).IsValid); 
    Assert.IsFalse(validator.Validate(new TestObject(3.01m)).IsValid); 
} 
4

Per quanto riguarda la versione 6.2 di FluentValidation è possibile costruire il parametro PropertyValidator.Validate() a causa di fare ValidatorSelectors globalmente configurabili: https://github.com/JeremySkinner/FluentValidation/commit/95376c0519da1a06388be91a97fb5062fd4a162e

Nell'esempio riportato di seguito si vede come ho validare la proprietà 'puic' di prova Track

Unità:

public void ExistsInCollectionValidatorTest() 
    { 
     var track = new Track() 
     { 
      puic = "p1" 
     }; 

     var sut = new ExistsInCollectionValidator<Track>(); 

     // Build PropertyValidator.Validate() parameter 
     var selector = ValidatorOptions.ValidatorSelectors.DefaultValidatorSelectorFactory(); 
     var context = new ValidationContext(track, new PropertyChain(), selector); 
     var propertyValidatorContext = new PropertyValidatorContext(context, PropertyRule.Create<Track,string>(t => t.puic), "puic"); 

     var results = sut.Validate(propertyValidatorContext); 
     // Assertion.. 
    }