2013-07-04 2 views
11

私は、ASP.NET MVC4 Web APIプロジェクトに、ODataQueryOptionsパラメータを受け入れるApiControllerを継承するコントローラを1つその入力。ASP.NET Web APIコントローラのnunitテストで新しいSystem.Web.Http.OData.Query.ODataQueryOptionsをインスタンス化する

プロジェクトのテストにNUnitとMoqを使用しています。これにより、ApiControllerで使用されている関連するリポジトリメソッドからの缶詰の応答をセットアップできます。これはのように、作品:私が持っている

[TestFixture] 
public class ProjectControllerTests 
{ 
    [Test] 
    public async Task GetById() 
    { 
     var repo = new Mock<IManagementQuery>(); 

     repo.Setup(a => a.GetProjectById(2)).Returns(Task.FromResult<Project>(new Project() 
     { 
       ProjectID = 2, ProjectName = "Test project", ProjectClient = 3 
     })); 

     var controller = new ProjectController(repo.Object); 
     var response = await controller.Get(2); 

     Assert.AreEqual(response.id, 2); 
     Assert.AreEqual(response.name, "Test project"); 
     Assert.AreEqual(response.clientId, 3); 
    } 
} 

課題は、このパターンを使用するために、私はコントローラに関連するクエリ文字列パラメータを渡すだけでなく、リポジトリ(これは実際に私の意図した)する必要があるということです。しかし、ODataQueryOptionsの場合、ApiControllerメソッドを受け入れる場合、ODataQueryOptionsのデフォルトパラメータを使用したい場合でも、インスタンス化する方法を知る必要があります。これは面倒です:

  • ODataQueryOptionsはインターフェイスを実装していないので、私はそれを直接模擬することはできません。
  • コンストラクタには、Microsoft.Data.Edm.IEdmModelを実装するものが必要なSystem.Web.Http.OData.OData.QueryContextの実装が必要です。このドキュメントでは、ドキュメントが不足しており、Visual Studio 2012参照の参照と呼び出し階層の表示洞察を提供しないでください(そのインターフェースを実装するものは何ですか?)。

これを行うにはどうすればよいですか?

ありがとうございました。

答えて

6

他の誰かがすでにコメントhereでこれに答え、それは(下記のコメントを参照)私のユースケースのための完全なソリューションではありませんように見える:

ODataModelBuilder modelBuilder = new ODataConventionModelBuilder(); 
modelBuilder.EntitySet<Customer>("Customers"); 
var opts = new ODataQueryOptions<Customer>(new ODataQueryContext(modelBuilder.GetEdmModel(),typeof(Customer)), request); 
+2

まあを注入するためにテストし、彼らは主に関連するオブジェクトをしています...これは本当ですか? objectcontext => odataqueryoptionsから行く方法がなければなりません、そうですか? – user483679

0

これは私が私の中で使用されているソリューションです。私が私のObjectContext内の各TEntityのためのEntitySet <>を提供する必要があることが表示されます、NUnitのは、私のEntitySetがEntityFrameworkモデルから導出されているので、ODataQueryOptions

private static IEdmModel _model; 
private static IEdmModel Model 
{ 
    get 
    { 
     if (_model == null) 
     { 
      var builder = new ODataConventionModelBuilder(); 

      var baseType = typeof(MyDbContext); 
      var sets = baseType.GetProperties().Where(c => c.PropertyType.IsGenericType && c.PropertyType.GetGenericTypeDefinition() == typeof(IDbSet<>)); 
      var entitySetMethod = builder.GetType().GetMethod("EntitySet"); 
      foreach (var set in sets) 
      { 
       var genericMethod = entitySetMethod.MakeGenericMethod(set.PropertyType.GetGenericArguments()); 
       genericMethod.Invoke(builder, new object[] { set.Name }); 
      } 

      _model = builder.GetEdmModel(); 
     } 

     return _model; 
    } 
} 

public static ODataQueryOptions<T> QueryOptions<T>(string query = null) 
{ 
    query = query ?? ""; 
    var url = "http://localhost/Test?" + query; 
    var request = new HttpRequestMessage(HttpMethod.Get, url); 
    return new ODataQueryOptions<T>(new ODataQueryContext(Model, typeof(T)), request); 
} 
関連する問題