2013-04-16 114 views
1

我正試圖從基於WebAPI的REST服務轉向包含OData新實現的服務。我的服務工作正常,但在如何創建將測試odata查詢選項的單​​元測試方面遇到困難。WebAPI odata單元測試

當單元測試的WebAPI的方法,我用建立httpRequestMessage和結構論將其注入:

var request = new HttpRequestMessage(); 
     request.Headers.Add("UserName", "TestUser"); 
     request.Headers.Add("Password", password); 
     request.Headers.Add("OverRideToken", "false"); 
     request.Headers.Add("AccessSystem", "Mobile"); 
     request.Headers.Add("Seed", "testSeed"); 

     var token = new Token(); 

     var authController = new AuthorizationController(request); 
     try 
     { 

      var returnValue = authController.Get(); 

我怎麼會去注射OData的要求嗎?我需要驗證$ filter,$ inlinecount和其他選項是否返回正確的記錄。

+0

您在使用QueryableAttribute?如果是這樣,感覺就像你將測試QueryableAttribute功能而不是你自己的控制器動作。 –

回答

0

您既可以測試您的控制器,也可以測試Web API的正在運行的實例(您應該可以同時執行這兩項操作)。

測試您的控制器無法實現您正在嘗試執行的操作,因此您需要通過創建Web API應用程序的自託管內存實例來進行測試。然後,您可以在測試類中使用HttpClient(您將不得不手動構建OData請求),也可以在測試類中使用WCF數據服務客戶端(這將允許您通過LINQ進行查詢)。

下面是使用WCF數據服務客戶端的例子:

public class ODataContainerFactory 
{ 
    static HttpSelfHostServer server; 

    public static MyApplicationServer.Acceptance.ODataService.Container Create(Uri baseAddress) 
    { 
     var config = new HttpSelfHostConfiguration(baseAddress); 

     // Remove self host requirement to run with Adminprivileges 
     config.HostNameComparisonMode = System.ServiceModel.HostNameComparisonMode.Exact; 

     // Register Web API and OData Configuration 
     WebApiConfig.Register(config); 

     // Configure IoC 
     ConfigureIoC(dataSource, config); 

     // Do whatever else, e.g. setup fake data sources etc. 
     ... 

     // Start server 
     server = new HttpSelfHostServer(config); 
     server.OpenAsync().Wait(); 

     // Create container 
     var container = new MyApplicationServer.Acceptance.ODataService.Container(new Uri(baseAddress.ToString() + "odata/")); 

     // Configure container 
     container.IgnoreResourceNotFoundException = true; 
     container.IgnoreMissingProperties = true; 

     return container; 
    } 

    private static void ConfigureIoC(MockDatasource dataSource, HttpSelfHostConfiguration config) 
    { 
     var container = new UnityContainer(); 
     container.RegisterType<TypeA, TypeB>(); 
     ... 
     ... 
     config.DependencyResolver = new IoCContainer(container); 
    } 

    public static void Destroy() 
    { 
     server.CloseAsync().Wait(); 
     server.Dispose(); 
    } 
} 

這裏的關鍵是WebApiConfig.Register(HttpConfiguration配置)方法調用,這是呼喚你的Web API項目。

注意,之前上面你將需要:

  1. 啓動Web API項目
  2. 在您的測試類中添加一個服務引用到您的OData根路徑。

這將創建一個Container對象(在上面MyApplicationServer.Acceptance.ODataService.Container的例子),你可以用它來查詢OData源在你的測試如下:

var odataContainer = ODataContainerFactory.Create(new Uri("http://localhost:19194/"); 

var result = odataContainer.MyEntities 
       .Expand(s => s.ChildReferenceType) 
       .Where(s => s.EntityKey == someValue).SingleOrDefault();