0

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

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

有任何想法吗?

4

1 回答 1

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

希望这对其他人有帮助。

于 2012-08-24T13:38:42.797 回答