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 파이프 라인을 통해 호출되는 경우에만 VBA 유효성 검사가 수행됩니다.

아마도 클라이언트 프록시를 만들지 않고도 WCF 파이프 라인을 통해 전화를 걸 수는 있지만 클라이언트가 원하는 오류를 정확하게 볼 수 있도록 클라이언트 프록시에서 테스트하는 것이 더 합리적이지 않습니까? 유효성 검사가 실패하면 서비스에서 게시 하시겠습니까?

1

별도로 검증을 테스트 할 수 있습니다. 유효성 검사 응용 프로그램 블록에는 서비스 코드를 직접 실행할 때 유효성 검사를 호출 할 수는 없지만 사용자가 알고있는 코드를 테스트하는 두 가지 방법이 있습니다.

  1. ValidatorFactory를 사용하여 입력 유형에 대한 유효성 검사기를 만들고 유효성 검사 결과에 예상되는 오류가 포함되어 있다고 가정하십시오.
  2. Validator를 직접 인스턴스화하고 다양한 입력으로 테스트합니다.

실제로 두 기술의 조합을 사용합니다. 복잡한 입력 유형에 대한 유효성 검증 오류를 테스트하는 방법 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의 경우 필자가 만든 유효성 검사기에 대한 사용 사례 시나리오를 다루는 테스트가 있습니다. 또 다른 예를 들어 :

[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]")); 
} 

방법이 당신이 당신의 XmlStringValidator을 위해 원하는대로 많은 테스트 시나리오를 만들 수 있습니다.

이 방법에 대한 자세한 내용은이 문서에서 확인할 수 있습니다. Chapter 6 - Banishing Validation Complication

관련 문제