0
我有一个WCF服务,它具有依赖于来自http请求的查询字符串的读取值(OData)的方法。我试图编写单元测试,将模拟值注入到查询字符串中,然后当我调用该方法时,由于请求上下文不可用,它将使用这些模拟值而不是错误。如何模拟WCF服务中的查询字符串?
我试过使用WCFMock(这是基于Moq),但我没有看到一种方法来设置或从它提供的WebOperationContext获取查询字符串。
任何想法?
我有一个WCF服务,它具有依赖于来自http请求的查询字符串的读取值(OData)的方法。我试图编写单元测试,将模拟值注入到查询字符串中,然后当我调用该方法时,由于请求上下文不可用,它将使用这些模拟值而不是错误。如何模拟WCF服务中的查询字符串?
我试过使用WCFMock(这是基于Moq),但我没有看到一种方法来设置或从它提供的WebOperationContext获取查询字符串。
任何想法?
我最终使用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();
希望这可以帮助其他人。
或者您可以使用WCFMock https://wcfmock.codeplex.com/ – PositiveGuy