2012-08-23 86 views
0

我有一个WCF服务,它具有依赖于来自http请求的查询字符串的读取值(OData)的方法。我试图编写单元测试,将模拟值注入到查询字符串中,然后当我调用该方法时,由于请求上下文不可用,它将使用这些模拟值而不是错误。如何模拟WCF服务中的查询字符串?

我试过使用WCFMock(这是基于Moq),但我没有看到一种方法来设置或从它提供的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

相关问题