2014-06-17 24 views
1

我試圖單元測試一個驗證器我有,檢查時,2場匹配 - 但在完全如何完成它的損失。FluentValidation測試當字段匹配

我已經試過

var validator = new CreateUserValidator(); 
validator.ShouldHaveValidationErrorFor(user => user.Password.Equals(user.PasswordConfirmation)); 

但對於ShouldHaveValidationErrorFor沒有重載需要1個說法。沒有聲明局部變量並將該值設置爲PasswordConfirmation的值,我很茫然地如何有效地測試它。

有沒有人有任何想法嗎?

+0

如果轉到ShouldHaveValidationErrorFor(..)的定義它接受哪些參數? – Spock

+0

之一:(此FluentValidation.IValidator 驗證器,System.Linq.Expressions.Expression >表達,TValue值)和(此FluentValidation.IValidator 驗證器,System.Linq.Expressions.Expression >表達,T objectToTest) –

+0

謝謝,看來你需要2個參數。請參閱下面的答案。 – Spock

回答

2

老實說,我發現擴展有點混亂,與Fluent驗證器本身一樣(這只是我的看法)但是一旦你習慣了它,擴展和產品是有用的。

對於您的問題, 需要

一個。第一個說法,說驗證者已經設置了什麼字段/屬性

b。違反/繼承規則驗證的對象。

請參閱下面的代碼。

[TestFixture] 
public class Tests 
{ 
    [Test] 
    public void NameEqualTest() 
    { 
     var v = new PersonValidator(); 
     var p = new Person() {Name1 = "Name2", Name2 = "Name2"}; 

     //I prefer this.. 
     //ValidationResult validationResult = v.Validate(p); 
     //Assert.True(validationResult.IsValid); 

     v.ShouldNotHaveValidationErrorFor(person => p.Name1, p); 
    } 
} 

使用ShouldNotHaveValidationErrorFor因爲它是不易混淆.. 當2種性能是相等的,試驗合格。即沒有驗證錯誤。

當2個屬性不相等時,會出現錯誤。

public class Person 
{ 
    public string Name1 { get; set; } 
    public string Name2 { get; set; } 
} 

public class PersonValidator : AbstractValidator<Person> 
{ 
    public PersonValidator() 
    { 
     RuleFor(x => x.Name1).Equal(x => x.Name2) 
      .WithMessage("names are not equal"); 
    } 
}