你如何模拟WCF服务中的查询字符串?

时间:2012-08-23 15:03:16

标签: wcf query-string moq

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

我尝试使用WCFMock(基于Moq)但是我没有看到从它提供的WebOperationContext设置或获取查询字符串的方法。

有什么想法吗?

1 个答案:

答案 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();

希望这有助于其他人。