1

我正在尝试测试我为我的 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();

但在这种情况下,不会调用验证。

4

2 回答 2

2

根据定义,这种测试是集成测试,而不是单元测试。只有通过 WCF 管道调用服务操作时,才会进行 VAB 验证。

虽然您也许可以在不创建客户端代理的情况下强制通过 WCF 管道进行调用,但从客户端代理进行测试以确保客户端准确地看到您希望从您的服务发布的错误不是更有意义吗当验证失败?

于 2010-08-02T17:42:15.823 回答
1

您可以单独测试验证。虽然在直接运行服务代码时调用验证是不可行的,但验证应用程序块有两种方法来测试您的代码(我知道)。

  1. 使用 ValidatorFactory 为您的输入类型创建验证器,并断言验证结果包含预期的错误。
  2. 直接实例化验证器并使用各种输入对其进行测试。

在实践中,我最终使用了这两种技术的组合。我使用方法一来测试复杂输入类型的验证错误。举个例子:

[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 创建尽可能多的测试场景。

您可以在本文中找到有关这些方法的更多信息:第 6 章 - 消除验证并发症

于 2012-07-25T15:21:14.737 回答