【问题标题】:Using NUnit to perform integration tests with ASP.NET WebApi controllers使用 NUnit 执行与 ASP.NET WebApi 控制器的集成测试
【发布时间】:2012-07-26 19:41:40
【问题描述】:

我正在尝试使用 NUnit 设置测试来执行 ASP.NET WebApi 控制器的一些集成测试。我发现了几篇讨论使用 HttpServer 进行内存托管的文章,这些文章似乎通过不需要托管所有内容的 Web 服务器来简化事情。

问题是我得到的唯一响应是 404-Not Found。

当通过浏览器或 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();
        }
    }
}

【问题讨论】:

  • 这看起来不错。没有看到控制器很难说。您能否发布此操作的定义 /api/Orders/GetOrderStatus?companyCode=001&orderNumber=1234 ?
  • 控制器没什么特别的。手动测试时一切正常。此外,无论我测试哪个控制器,我都会得到相同的结果。

标签: .net nunit asp.net-web-api


【解决方案1】:

我也看到了这个问题,当我将测试类移动到与控制器相同的程序集中时,它似乎消失了;我知道通常不适合测试。

经过一番挖掘后,似乎只有当调用代码与控制器不共享相同的程序集时才会出现一个错误,因为它没有设法加载所需的程序集。

要确认这是您的问题/临时解决方法,请将其添加为测试的第一行:-

Type myType = typeof(myControllerType);

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

【讨论】:

  • 将您的答案标记为正确。我也在 asp.net 论坛上发布了我的问题并得到了相同的答案。我必须做更多的工作,因为我还必须确保您的控制器所需的所有依赖项都可用(duh!)forums.asp.net/t/1829098.aspx/…
  • 为什么会这样?我也有这个,如果我把测试方法放在同一个程序集中它可以工作,但如果我把它放在其他地方,就像在测试项目中一样,它就行不通。
猜你喜欢
  • 2018-10-27
  • 2016-10-31
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-07-19
  • 1970-01-01
相关资源
最近更新 更多