2012-07-26 95 views
7

我正在嘗試使用NUnit安裝測試以執行ASP.NET WebApi控制器的一些集成測試。我發現了一些討論使用HttpServer的內存託管的文章,似乎通過不需要託管所有內容的Web服務器來簡化事情。使用NUnit與ASP.NET WebApi控制器執行集成測試

問題是我曾經得到的是404未找到的唯一回應。

當通過瀏覽器或Fiddler手動測試時,控制器正在工作。路線定義是從工作地點複製的。 api項目被測試項目引用,並且dll被複制到與測試相同的文件夾中。

在此先感謝。

下面是測試類

[TestFixture] 
public class InMemoryTests 
{ 
    private HttpServer Server; 
    private string UrlBase = "http://some.server/"; 

    [TestFixtureSetUp] 
    public void Setup() 
    { 

     var config = new HttpConfiguration(); 
     config.Routes.MapHttpRoute(name: "Default", routeTemplate: "api/{controller}/{action}/{id}", defaults: new { id = RouteParameter.Optional }); 
     config.IncludeErrorDetailPolicy = IncludeErrorDetailPolicy.Always; 

     Server = new HttpServer(config); 
    } 

    [Test] 
    public void GetOrderStatus() 
    { 
     var client = new HttpClient(Server); 
     var request = createRequest("api/Orders/GetOrderStatus?companyCode=001&orderNumber=1234", "application/json", HttpMethod.Get); 

     using (HttpResponseMessage response = client.SendAsync(request).Result) 
     { 
      Assert.IsNotNull(response); 
      Assert.AreEqual(HttpStatusCode.OK, response.StatusCode); 
      Assert.NotNull(response.Content); 
     } 
    } 

    private HttpRequestMessage createRequest(string url, string mthv, HttpMethod method) 
    { 
     var request = new HttpRequestMessage(); 

     request.RequestUri = new Uri(UrlBase + url); 
     request.Headers.Accept.Add(new MediaTypeWithQualityHeaderValue(mthv)); 
     request.Method = method; 

     return request; 
    } 

    private HttpRequestMessage createRequest<T>(string url, string mthv, HttpMethod method, T content, MediaTypeFormatter formatter) where T : class 
    { 
     HttpRequestMessage request = createRequest(url, mthv, method); 
     request.Content = new ObjectContent<T>(content, formatter); 

     return request; 
    } 

    public void Dispose() 
    { 
     if (Server != null) 
     { 
      Server.Dispose(); 
     } 
    } 
} 
+0

這看起來OK。很難說沒有看到控制器。您可以發佈此操作的定義/ api/Orders/GetOrderStatus?companyCode = 001&orderNumber = 1234? – 2012-07-26 21:57:38

+0

控制器沒什麼特別的。手動測試時,它都可以工作。無論我測試哪個控制器,我也得到相同的結果。 – Rick 2012-07-27 00:28:20

回答

8

我也看到了這個問題,似乎當我提出我的測試類到相同的組件,我的控制器走開;對於我所知道的測試通常不太實際。

經過一番挖掘之後,它出現了一個錯誤,只有當調用代碼與控制器不共享相同的程序集,因爲它沒有設法加載所需的程序集時,它纔會出現在自身主機上。

,確認這是你的問題/解決方法暫時添加此作爲測試的第一行: -

Type myType = typeof(myControllerType); 

更多信息在:http://forums.asp.net/t/1772734.aspx/1

+0

標記你的答案是正確的。我也在asp.net論壇上發佈了我的問題,並得到了相同的答案。我必須做更多的工作,因爲我還必須確保您的控制器所需的所有依賴項都可用(duh!)http://forums.asp.net/t/1829098.aspx/1?Using+HttpServer+to +執行+集成+測試+ + NUnit – Rick 2012-08-01 13:42:16

+0

爲什麼會出現這種情況?我也有這個地方,如果我把測試方法放在它工作的同一個程序集中,但是如果我把它放在其他地方,就像在測試項目中那樣,它就不起作用。 – appsecguy 2013-04-30 20:30:38

+0

過去兩天這個問題一直困擾着我。謝謝你這麼!!! – Jethro 2013-09-09 07:36:48