2012-08-23 2 views
0

HTTP 요청의 쿼리 문자열에서 값 (OData)을 읽는 것에 의존하는 메서드가있는 WCF 서비스가 있습니다. 모의 값을 입문 문에 주입하는 단위 테스트를 작성하려고하는데, 메소드를 호출하면 요청 문맥이 사용 가능하지 않기 때문에 오류가 아닌 모의 값을 사용하게됩니다.WCF 서비스에서 쿼리 문자열을 조롱하는 방법은 무엇입니까?

(Moq에 기반한) WCFMock을 사용해 보았지만 제공하는 WebOperationContext에서 쿼리 문자열을 설정하거나 가져올 방법이 없습니다.

아이디어가 있으십니까?

답변

1

이 문제를 해결하기 위해 IOC 패턴을 사용하여 결국 서비스 생성자에 전달되는 IQueryStringHelper 인터페이스를 만들었습니다. 전달되지 않으면 기본적으로 "실제"QueryStringHelper 클래스를 사용합니다. 테스트 케이스를 실행할 때 오버로드 된 서비스 생성자를 사용하여 TestQueryStringHelper 인스턴스를 전달하므로 쿼리 문자열에 대한 모의 값을 설정할 수 있습니다.

다음은 쿼리 문자열 헬퍼 코드입니다.

public interface IQueryStringHelper { 
     string[] GetParameters(); 
    } 

    public class QueryStringHelper : IQueryStringHelper { 
     public string[] GetParameters() { 
      var properties = OperationContext.Current.IncomingMessageProperties; 
      var property = properties[HttpRequestMessageProperty.Name] as HttpRequestMessageProperty; 
      string queryString = property.QueryString; 
      return queryString.Split('&'); 
     } 
    } 

    public class TestQueryStringHelper : IQueryStringHelper { 
     private string mockValue; 

     public TestQueryStringHelper(string value) { 
      mockValue = value; 
     } 

     public string[] GetParameters() { 
      return mockValue.Split('&'); 
     } 
    } 

그리고 서비스 구현 :

public partial class RestService : IRestService { 
      private IAuthenticator _auth; 
      private IQueryStringHelper _queryStringHelper; 

      public RestService() : this(new Authenticator(), new QueryStringHelper()) { 
      } 

      public RestService(IAuthenticator auth, IQueryStringHelper queryStringHelper = null) { 
       _auth = auth; 
       if (queryStringHelper != null) { 
        _queryStringHelper = queryStringHelper; 
       } 
      } 
} 

어떻게 테스트 케이스에서 소비하는 방법 :

string odata = String.Format("$filter=Id eq guid'{0}'", "myguid"); 
var service = new RestService(m_auth,new TestQueryStringHelper(odata)); 
var entities = service.ReadAllEntities(); 

는 희망이 다른 사람을 도움이됩니다.

+0

또는 WCFMock https://wcfmock.codeplex.com/을 사용할 수 있습니다. – PositiveGuy

관련 문제