您可以單獨測試驗證。儘管在直接運行服務代碼時調用驗證是不可行的,但驗證應用程序塊有兩種測試代碼的方法(我知道這一點)。
- 使用ValidatorFactory爲您的輸入類型創建驗證器,並聲明驗證結果包含預期的錯誤。
- 直接實例化Validator並用各種輸入測試它。
在實踐中,我最終使用了兩種技術的組合。我使用方法一來測試複雜輸入類型的驗證錯誤。舉個例子:
[DataContract]
public class Product
{
[DataMember, NotNullValidator]
public string Name { get; set; }
[DataMember, RangeValidator(0.0, RangeBoundaryType.Exclusive,
double.MaxValue, RangeBoundaryType.Ignore,
ErrorMessage = "The value cannot be less than 0.")]
public double Price { get; set; }
}
[TestMethod]
public void InvalidProduct_ReturnsValidationErrors()
{
Product request = new Product()
{
Price = -10.0
};
var validatorFactory = EnterpriseLibraryContainer.Current
.GetInstance<ValidatorFactory>();
var validator = validatorFactory.CreateValidator<Product>();
var results = validator.Validate(request);
Assert.IsTrue(results.Any(vr => vr.Key == "Name"
&& vr.Message == "The value cannot be null."));
Assert.IsTrue(results.Any(vr => vr.Key == "Price"
&& vr.Message == "The value cannot be less than 0."));
}
對於方法2我會測試覆蓋我創建的驗證器的用例場景。再例如:
[TestMethod]
public void XmlStringValidator_ReturnsErrors_OnInvalidInput()
{
var validator = new XmlStringValidator();
var results = validator.Validate("Your input goes here");
Assert.IsTrue(results.Any(vr => vr.Key == "[KeyNameInValidator]" &&
vr.Message == "[Expected error message based on input]"));
}
方法2將允許您爲XmlStringValidator創建儘可能多的測試場景。
在這篇文章中你可以找到更多關於這些方法的信息:Chapter 6 - Banishing Validation Complication