我有一个 WCF 服务,它的方法依赖于从 http 请求的查询字符串中读取值(OData)。我正在尝试编写将模拟值注入查询字符串的单元测试,然后当我调用该方法时,它将使用这些模拟值而不是由于请求上下文不可用而出错。
我尝试过使用WCFMock(基于 Moq),但是我看不到从它提供的 WebOperationContext 设置或获取查询字符串的方法。
有任何想法吗?
我有一个 WCF 服务,它的方法依赖于从 http 请求的查询字符串中读取值(OData)。我正在尝试编写将模拟值注入查询字符串的单元测试,然后当我调用该方法时,它将使用这些模拟值而不是由于请求上下文不可用而出错。
我尝试过使用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();
希望这对其他人有帮助。