4

以前は、次のような Web API コントローラーがありました。

    public IQueryable<ApiDesignOverview> GetList(
        string brandIds = "", 
        string categoryIds = "", 
        string query = "",
        string categoryOp = "or")

OData NuGet パッケージが $inlinecount OData パラメーターをサポートするようになったと聞いたので、http: //www.asp.net/web-api/overview/odata-support-in-aspnet-web の手順を使用して追加しようとしました-api/supporting-odata-query-options - OData ホールセールを使用する必要はありません。アプリの再構築が大量に必要になるため、このPageResult<T>オプションを選択しました。

だから今私のコントローラは次のようになります:

    public PageResult<ApiDesignOverview> GetList(
        ODataQueryOptions<ApiDesignOverview> options,
        string brandIds = "", 
        string categoryIds = "", 
        string query = "",
        string categoryOp = "or")

私の問題は今:

  • 単体テストのために ODataQueryOptions をモックするにはどうすればよいですか?
  • それらを嘲笑できない場合、どうすれば作成できますか? をODataQueryContext構築するには が必要でMicrosoft.Data.Edm.IEdmModel、これには が必要です。これに関するドキュメントが見つかりません。

本当に、以前のようにコントローラーの署名から ODataQueryOptions を削除できた方がよいでしょう。これは可能ですか?

4

3 に答える 3

11

ODataQueryOptions と PageResult の使用を変更したくない (または私の場合は変更できない) 場合は、単体テスト用に ODataQueryOptions インスタンスを作成する方法を次に示します。

//arrange
var request = new HttpRequestMessage(HttpMethod.Get, "http://localhost/MyProject/api/Customers?$filter=CustomerID eq 1");
var controller = new CustomersController
{
    Request = request
};

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

//act
var result = controller.Get(opts);

//assert
Assert.AreEqual(1, result.Items.First().CustomerID);
于 2013-05-03T14:56:19.467 に答える
0

最新ODataControllerには、AllowedQueryOptionsこれを解決する があります。

public class MyOdataController : ODataController

    {
        [Queryable(AllowedQueryOptions = AllowedQueryOptions.All)]
        public IQueryable<Product> Get()
        {
            return Products.AsQueryable();
        }
    }
于 2014-01-18T00:38:49.123 に答える