我正在尝试测试我为我的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();
但在这种情况下,不会调用验证。
答案 0 :(得分:2)
根据定义,这种测试是集成测试,而不是单元测试。只有在通过WCF管道调用服务操作时才会进行VAB验证。
虽然您可以在不创建客户端代理的情况下强制通过WCF管道进行调用,但是从客户端代理进行测试是否更有意义,以确保客户端确切地看到您希望发布的错误验证失败时从您的服务中获取?
答案 1 :(得分:1)
您可以单独测试验证。虽然在直接运行服务代码时调用验证是不可行的,但验证应用程序块有两种方法可以测试您的代码(我知道)。
在实践中,我最终使用了这两种技术的组合。我使用方法一来测试复杂输入类型的验证错误。举个例子:
[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,我会进行测试,涵盖我创建的Validators的用例场景。另一个例子:
[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