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