2016-11-09 64 views
7

我试图单元测试出OData的控制器,但API的变化,先前建议我尝试不工作方法 - 目前我得到如何正确单元测试OData v6.0控制器?

没有登记的非的OData HTTP路线。

试图实例ODataQueryOptions时传递到控制器的Get方法

我当前的代码(基于像this one答案):

 [TestMethod()] 
    public void RankingTest() 
    { 
     var serviceMock = new Mock<IVendorService>(); 
     serviceMock.SetReturnsDefault<IEnumerable<Vendor>>(new List<Vendor>() 
     { 
      new Vendor() { id = "1" } 
     }); 

     HttpRequestMessage request = new HttpRequestMessage(HttpMethod.Get, "http://localhost/odata/Vendor"); 

     ODataModelBuilder builder = new ODataConventionModelBuilder(); 
     builder.EntitySet<Vendor>("Vendor"); 
     var model = builder.GetEdmModel(); 

     HttpRouteCollection routes = new HttpRouteCollection(); 
     HttpConfiguration config = new HttpConfiguration(routes) { IncludeErrorDetailPolicy = IncludeErrorDetailPolicy.Always }; 

     // attempting to register at least some non-OData HTTP route doesn't seem to help 
     routes.MapHttpRoute("Default", "{controller}/{action}/{id}", 
      new 
      { 
       controller = "Home", 
       action = "Index", 
       id = UrlParameter.Optional 
      } 
      ); 
     config.MapODataServiceRoute("odata", "odata", model); 
     config.Count().Filter().OrderBy().Expand().Select().MaxTop(null); 
     config.EnsureInitialized(); 

     request.SetConfiguration(config); 
     ODataQueryContext context = new ODataQueryContext(
      model, 
      typeof(Vendor), 
      new ODataPath(
       new Microsoft.OData.UriParser.EntitySetSegment(
        model.EntityContainer.FindEntitySet("Vendor")) 
      ) 
     ); 


     var controller = new VendorController(serviceMock.Object); 
     controller.Request = request; 

     // InvalidOperationException in System.Web.OData on next line: 
     // No non-OData HTTP route registered 
     var options = new ODataQueryOptions<Vendor>(context, request); 

     var response = controller.Get(options) as ViewResult; 

    } 

感谢您的任何意见或指针!

回答

12

调用EnableDependencyInjection方法从System.Web.OData.Extensions.HttpConfigurationExtensions类地址:

HttpConfiguration config = new HttpConfiguration(); 

//1   
config.EnableDependencyInjection(); 

//2 
config.EnsureInitialized(); 
+2

谢谢,这似乎已经做到了! – kerray