2013-05-22 60 views
1

我想爲我的ASP.NET WebApi服務編寫測試,並針對自託管服務和實時Web託管服務運行該測試。我想這可以用測試夾具完成,但我不確定如何設置它。有誰知道使用可配置測試夾具的例子,以便您可以將參數傳遞給Xunit以選擇自己託管的夾具還是Web主機夾具?如何在自主主機和生產webapi服務上運行XUnit測試?

回答

0

我會建議使用內存服務器來測試你的控制器,所以你不需要在你的單元測試中啓動自主主機。

http://blogs.msdn.com/b/youssefm/archive/2013/01/28/writing-tests-for-an-asp-net-webapi-service.aspx

+1

只是FYI ......當進行內存中測試時,我們需要確保請求和響應經過格式化程序的序列化/反序列化過程以捕獲任何問題...在我的非常老的帖子中有一些信息: http://blogs.msdn.com/b/kiranchalla/archive/2012/05/06/in-memory-client-amp-host-and-integration-testing-of-your-web-api-service.aspx。考慮到這一點,我認爲做自我主機測試是一個更好的選擇... –

1

這裏是如何用最新的xUnit 2.0測試版的工作。

創建一個夾具:

public class SelfHostFixture : IDisposable { 
    public static string HostBaseAddress { get; private set; } 
    HttpSelfHostServer server; 
    HttpSelfHostConfiguration config; 

    static SelfHostFixture() { 
     HostBaseAddress = ConfigurationManager.AppSettings["HostBaseAddress"]; // HttpClient in your tests will need to use same base address 
     if (!HostBaseAddress.EndsWith("/")) 
      HostBaseAddress += "/"; 
    } 

    public SelfHostFixture() { 
     if (/*your condition to check if running against live*/) { 
      config = new HttpSelfHostConfiguration(HostBaseAddress); 
      WebApiConfig.Register(config); // init your web api application 
      var server = new HttpSelfHostServer(config); 
      server.OpenAsync().Wait(); 
     } 
    } 

    public void Dispose() { 
     if (server != null) { 
      server.CloseAsync().Wait(); 
      server.Dispose(); 
      server = null; 

      config.Dispose(); 
      config = null; 
     } 
    } 
} 

然後定義將使用固定的集合。集合是在xUnit 2中進行組測試的新概念。

[CollectionDefinition("SelfHostCollection")] 
public class SelfHostCollection : ICollectionFixture<SelfHostFixture> {} 

它只是一個標記,所以沒有實現。 現在,依靠你的主機上標記測試是集合中:

[Collection("SelfHostCollection")] 
public class MyController1Test {} 

[Collection("SelfHostCollection")] 
public class MyController4Test {} 

亞軍將創建一個從MyController1Test中運行任何測試時,你的夾具和MyController4Test的單一實例確保您的服務器只啓動一次每集合。

相關問題