2015-06-27 35 views
5

Tôi có các quy tắc tương tự cho một số thuộc tính trong nhiều đối tượng mô hình và tôi muốn thay thế chúng bằng trình xác thực thuộc tính tùy chỉnh để tránh trùng lặp mã trong các thử nghiệm đơn vị.Làm thế nào để kiểm tra đơn vị tài sản đơn giản có bộ xác thực?

Tôi có validator của tôi sở hữu:

public class IntIdPropertyValidator: PropertyValidator 
{ 
    public IntIdPropertyValidator() 
     : base("Property {PropertyName} should be greater than 0") 
    { 
    } 

    protected override bool IsValid(PropertyValidatorContext context) 
    { 
     var value = (int)context.PropertyValue; 

     return value > 0; 
    } 
} 

và dây điện nó lên trong lớp validator mô hình:

public class SomeRequestValidator : AbstractValidator<CreateWordRequest> 
{ 
    public SomeRequestValidator() 
    { 
     RuleFor(x => x.Id).SetValidator(new IntIdPropertyValidator()); 
    } 
} 

Cố gắng để kiểm tra:

[Test] 
public void Validate_IdHasValidator_Success() 
{ 
    Init(); 

    validator.ShouldHaveChildValidator(x => x.Id, typeof(IntIdPropertyValidator)); 
} 

Nhưng thử nghiệm luôn luôn thất bại.

Vì vậy, làm cách nào để kiểm tra trình xác thực đó thực sự được đặt cho Id thuộc tính?

Trả lời

6

Bạn đang sử dụng ShouldHaveChildValidator sai cách. Id là một loại đơn giản.

ShouldHaveChildValidator đang được sử dụng trên các loại phức tạp. (Xem thêm các source code)

Cách đúng để kiểm tra tài sản là để vượt qua đối tượng có giá trị và các đối tượng không hợp lệ và sau đó varify sử dụng ShouldNotHaveValidationErrorForShouldHaveValidationErrorFor:

[Test] 
public void Should_have_error_when_Id_Is_Ilegal() { 
     validator.ShouldHaveValidationErrorFor(p => p.Id, new CreateWordRequest()); 
} 

[Test] 
public void Should_not_have_error_when_Id_Is_Legal() { 
     validator.ShouldNotHaveValidationErrorFor(p => p.Id, new CreateWordRequest() 
                  { 
                   Id = 7 
                  }); 
} 

Sửa

Các mã sau sẽ thực hiện xác minh bạn đang tìm kiếm:

[Test] 
public void Validate_IdHasValidator_Success() 
{ 
    var validator = new SomeRequestValidator(); 

    var descriptor = validator.CreateDescriptor(); 
    var matchingValidators = descriptor.GetValidatorsForMember(
       Extensions.GetMember<CreateWordRequest, int>(x => x.Id).Name); 

    Assert.That(matchingValidators.FirstOrDefault(), Is.InstanceOf<IntIdPropertyValidator>()); 

} 

Tôi muốn giải thích cho bạn lý do bạn không nên sử dụng mã trên.

Khi bạn học lớp UT, bạn xác minh rằng hành vi của lớp học sẽ không bị tổn hại.

Khi bạn tạo một validator tùy chỉnh, bạn tạo ra một lớp với một trách nhiệm để xác minh mô hình cụ thể (-> quy tắc kinh doanh) ...

Id là một loại đơn giản với một quy tắc kinh doanh theo mô hình mẹ mình . Vì vậy, bạn cần phải xác minh các quy tắc kinh doanh của Id thông qua trình xác thực mô hình.

Giả sử rằng một trong các mô hình của bạn đột nhiên cần phải thay đổi. Trong trường hợp này, bạn không có bất kỳ xác nhận nào mà bất kỳ quy tắc kinh doanh hiện tại nào của bạn sẽ không bị tổn hại (hoặc bạn quyết định thực hiện thay đổi bên trong IntIdPropertyValidator, việc di chuyển đó sẽ ảnh hưởng đến mọi nơi, ngay cả khi bạn không muốn).

Tạo tùy chỉnh Property Validator rất tốt để bảo trì mã tuy nhiên, các thử nghiệm phải chống lại trình xác thực mô hình.

Trên các loại phức tạp, câu chuyện hoàn toàn khác:

Thông thường các loại phức tạp có quy tắc kinh doanh riêng. Trong trường hợp này, bạn phải tạo trình xác thực tùy chỉnh cho chúng và sau đó xác minh rằng trình xác thực hợp lệ của cha sử dụng trình xác nhận hợp lệ. Một điều khác để xác minh là: Nếu loại phức hợp là Null hoặc các quy tắc phức tạp như "khi giá trị thuộc tính là X và trạng thái loại phức tạp là Y" ...

+0

Vâng, vâng, tôi biết, và đó là cách tôi đã kiểm tra trình xác thực tùy chỉnh mà chính nó. Nhưng vấn đề là bây giờ tôi không muốn làm điều đó cho mỗi lớp mô hình mà có sự chống đỡ với người xác nhận đó. Tôi muốn kiểm tra nếu validator thực sự được thiết lập cho các prop, và không kiểm tra nó nếu nó hoạt động chính xác, cuz đó là những gì kiểm tra của trình duyệt tính hợp lệ tùy chỉnh làm. – liri2006

+0

@ liri2006 Tôi đã cập nhật câu trả lời của mình bằng cách xác minh bạn đang tìm kiếm ... Tôi cũng giải thích lý do bạn không nên làm như vậy .... –

+0

Điều đó cực kỳ hữu ích! Cả mã và giải thích. – liri2006

Các vấn đề liên quan