2012-07-26 140 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