我之前有一个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 categoryOp = "or")
我现在的问题是:
>如何模拟ODataQueryOptions进行单元测试?
>如果他们不能被嘲笑,我该如何创建?我需要一个ODataQueryContext来构造一个,这需要一个Microsoft.Data.Edm.IEdmModel,这需要……什么?我找不到任何相关的文档.
真的,如果我像以前一样从控制器签名中删除ODataQueryOptions会更好.这可能吗?
解决方法
如果您更喜欢返回IQueryable并希望支持$inlinecount,那么仍然可以通过对QueryableAttribute进行编码来实现.
public class InlineCountQueryableAttribute : QueryableAttribute { private static MethodInfo _createPageResult = typeof(InlineCountQueryableAttribute) .getmethods(BindingFlags.Static | BindingFlags.NonPublic) .Single(m => m.Name == "CreatePageResult"); public override void OnActionExecuted(HttpActionExecutedContext actionExecutedContext) { base.OnActionExecuted(actionExecutedContext); HttpRequestMessage request = actionExecutedContext.Request; HttpResponseMessage response = actionExecutedContext.Response; IQueryable result; if (response.IsSuccessstatusCode && response.TryGetContentValue<IQueryable>(out result)) { long? inlineCount = request.GetInlineCount(); if (inlineCount != null) { actionExecutedContext.Response = _createPageResult.MakeGenericmethod(result.ElementType).Invoke( null,new object[] { request,request.GetInlineCount(),request.GetNextPageLink(),result }) as HttpResponseMessage; } } } internal static HttpResponseMessage CreatePageResult<T>(HttpRequestMessage request,long? count,Uri nextpageLink,IEnumerable<T> results) { return request.CreateResponse(HttpStatusCode.OK,new PageResult<T>(results,nextpageLink,count)); } }
请注意,我使用反射来创建PageResult.您可以改为返回您喜欢的对象,该对象可以由您使用的格式化程序格式化.如果您使用Json格式化程序,则具有结果和计数的匿名对象也将起作用.
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。