微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

asp.net-mvc – Web API,OData,$inlinecount和测试

我之前有一个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 举报,一经查实,本站将立刻删除。

相关推荐