http 要求のクエリ文字列からの値 (OData) の読み取りに依存するメソッドを持つ WCF サービスがあります。モック値をクエリ文字列に挿入する単体テストを作成しようとしています。メソッドを呼び出すと、リクエストコンテキストが利用できないためにエラーが発生するのではなく、これらのモック値が使用されます。
WCFMock (Moq に基づく)を使用してみましたが、それが提供する WebOperationContext からクエリ文字列を設定または取得する方法がわかりません。
何か案は?
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();
うまくいけば、これは他の誰かに役立ちます。