2017-10-10 79 views
0

我已经实现并为我的测试用例实现了ODataControllerExtensions类。我选择使用NSubstitue来模拟DbContext和Entities。如何为Microsoft.OData.Edm.IEdmModel注册服务类型

的问题是,当我试图让ODataPath

public static IQueryable<TResult> InvokeForTest<T, TResult>(this T controller, HttpMethod method, string entitySetName, string relativeSubPathUri, Func<T, ODataQueryOptions<TResult>, IQueryable<TResult>> expression) 
    where T : ODataController 
    where TResult : class 
{ 
    return controller.InvokeForTest(method, relativeSubPathUri, x => 
    { 
    var builder = new ODataConventionModelBuilder(); 
    builder.EnableLowerCamelCase(); 
    builder.EntitySet<TResult>(entitySetName); 
    IEdmModel model = builder.GetEdmModel(); 



    string pathString = string.Format("{0}{1}", entitySetName, relativeSubPathUri); 

    ODataPath path = new DefaultODataPathHandler().Parse("https://any//", pathString, new ResolverIndirection(controller.Configuration.DependencyResolver)); 

    var context = new ODataQueryContext(model, typeof(TResult), path); 
    var options = new ODataQueryOptions<TResult>(context, controller.Request); 

    // Run the expression. 
    return expression(x, options); 
    }); 
} 

,当我试图让IServiceProvider的

new ResolverIndirection(controller.Configuration.DependencyResolver) 

class ResolverIndirection : IServiceProvider 
    { 
     private readonly IDependencyResolver _resolver; 

     public ResolverIndirection(IDependencyResolver resolver) 
     { 
     _resolver = resolver; 
     } 

     public object GetService(Type serviceType) 
     { 
     return _resolver.GetService(serviceType); 
     } 
    } 

的例外,我得到的是问题出现。

System.InvalidOperationException:没有为'Microsoft.OData.Edm.IEdmModel'类型注册服务。

我想知道是否有办法注册EdmlModel的服务类型。如果我以错误的方式回答这个问题,我会提出一些建议,告诉我如何做到这一点。

由于

回答

0

代替

新ResolverIndirection(controller.Configuration.DependencyResolver)

随着

的IServiceProvider requestContainer = controller.Request.CreateRequestContainer(控制器。 Reque st.ODataProperties()RouteName)。

但在此之前,你必须注册一个新的服务路线

HttpConfiguration配置= controller.Request.GetConfiguration(); config.MapODataServiceRoute(controller.Request.ODataProperties()。RouteName,“/”,model);

这就是最终来源的样子。

返回controller.InvokeForTest(方法,relativeSubPathUri,X => {
变种助洗剂=新ODataConventionModelBuilder();
builder.EnableLowerCamelCase();
builder.EntitySet(entitySetName); IEdmModel模型= builder.GetEdmModel(); HttpConfiguration配置= controller.Request.GetConfiguration();
config.MapODataServiceRoute(controller.Request.ODataProperties()RouteName, “/”,模型);

string pathString = $“{entitySetName} {relativeSubPathUri}”;
IServiceProvider requestContainer = controller.Request.CreateRequestContainer(controller.Request.ODataProperties()。RouteName); ODataPath path = new DefaultODataPathHandler()。解析(“https://any//”, pathString,requestContainer);

var context = new ODataQueryContext(model,typeof(TResult),path);
var options = new ODataQueryOptions(context, controller.Request);

//运行表达式。返回表达式(x,options); });