2014-06-11 14 views
9

Có thể thử nghiệm FluentValidation PropertyValidator trong sự cô lập?Thử nghiệm FluentValidation PropertyValidator

Tôi biết tôi có thể kiểm tra Trình xác thực đang sử dụng PropertyValidator cho các lỗi cụ thể nhưng tôi muốn kiểm tra đúng/sai chỉ trên trình xác thực thuộc tính nếu có thể.

Việc này có thể thực hiện được không? Nếu vậy, làm thế nào?

+1

@wonea xem xét [kiểm tra có sẵn] (https://github.com/JeremySkinner/FluentValidation/blob/master/src/FluentValidation.Tests/PropertyValidatorTester.cs) tại [site project] (https://github.com) /JeremySkinner/FluentValidation/tree/master/src/FluentValidation.Tests) cho thấy các câu trả lời được cung cấp ở đây khớp với những gì chủ sở hữu sử dụng để kiểm tra nguồn. – Nkosi

+0

@wonea và dựa trên dấu thời gian trên các bài kiểm tra có liên quan mà chúng chưa thay đổi trong vòng 2 năm qua. – Nkosi

Trả lời

8

Tôi cũng muốn thử nghiệm logic đúng/sai của mình. Nó là một sự xấu hổ phương pháp IsValid được bảo vệ. Công việc của tôi xung quanh là tạo ra một phương pháp IsValid khác và có cuộc gọi IsValid được bảo vệ thông qua nó.

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

Chúc mừng Giàu, tôi đã hy vọng có một cách khác không liên quan đến cách giải quyết nhưng điều này sẽ cho tôi những gì tôi cần. Cảm ơn một lần nữa :) – Jamez

5

Tôi biết điều này đã được một thời gian, nhưng tôi đạt được điều này như sau:

Tuỳ chỉnh 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; 
    } 
} 

thử nghiệm Validator:

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

Kiểm tra đối tượng:

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

    public decimal? GenericDecimal { get; set; } 
} 

Test:

[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

Đối với phiên bản 6.2 của FluentValidation nó có thể để xây dựng các thông số PropertyValidator.Validate() do làm ValidatorSelectors cấu hình toàn cầu: https://github.com/JeremySkinner/FluentValidation/commit/95376c0519da1a06388be91a97fb5062fd4a162e

Trong ví dụ dưới đây bạn thấy làm thế nào tôi xác nhận tài sản 'puic' thử nghiệm Track

Đơn vị:

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.. 
    }