1

我試圖測試我爲我的wcf服務設置的驗證。什麼是最好的方式來做到這一點?wcf和驗證應用程序塊單元測試

[ServiceContract] 
[ValidationBehavior] 
public interface IXmlSchemaService 
{ 

    [OperationContract(Action = "SubmitSchema")] 
    [return: MessageParameter(Name = "SubmitSchemaReturn")] 
    [FaultContract(typeof(ValidationFault))] 
    JobData SubmitSchema([XmlStringValidator] string xmlString); 
} 

XmlStringValidator是我創建的自定義驗證程序。理想情況下,我想要類似於:

XmlSchemaService service = new XmlSchemaService(); 
service.SubmitSchema(); 

但是在這種情況下,不會調用驗證。

回答

2

根據定義,這種測試是一種集成測試,而不是單元測試。只有在通過WCF管道調用服務操作時纔會進行VAB驗證。

雖然你可以強制你的調用通過WCF管道而不需要創建客戶端代理,但是從客戶端代理測試它是否更有意義,以確保客戶端看到你想要的錯誤驗證失敗時從您的服務發佈?

1

您可以單獨測試驗證。儘管在直接運行服務代碼時調用驗證是不可行的,但驗證應用程序塊有兩種測試代碼的方法(我知道這一點)。

  1. 使用ValidatorFactory爲您的輸入類型創建驗證器,並聲明驗證結果包含預期的錯誤。
  2. 直接實例化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