【问题标题】:Integration Testing - How to hit endpoints using Microsoft.Owin.Testing.TestServer?集成测试 - 如何使用 Microsoft.Owin.Testing.TestServer 命中端点?
【发布时间】:2019-06-19 20:07:46
【问题描述】:

我已经设置了一个基本的 Web API 项目来测试编写集成测试,设置如下

启动:

using Microsoft.Owin;
using Owin;

[assembly: OwinStartup(typeof(WebApiTest.Startup))]

namespace WebApiTest
{
    public class Startup
    {
        public void Configuration(IAppBuilder app)
        {
            WebApiConfig.Register(new System.Web.Http.HttpConfiguration());
        }
    }
}

还有以下控制器:

using System.Web.Http;

namespace WebApiTest.Controllers
{
    public class TestController : ApiController
    {
        public IHttpActionResult Post()
        {
            return Ok("Hello, world!");
        }
    }
}

对于我的测试项目,我使用NUnit 进行测试,并且有两个类:一个抽象的BaseTest 类和一个包含一个测试的ControllerTests 类,目的是向以上TestControllerGET操作方法:

基础测试:

using Microsoft.Owin.Testing;
using NUnit.Framework;
using System;
using System.Net.Http;

namespace WebApiTest.Tests
{
    public abstract class BaseTest : IDisposable
    {
        protected const string _url = "http://localhost/";
        protected TestServer _server;

        public void Dispose()
        {
            _server.Dispose();
        }

        [SetUp]
        public void SetUp()
        {
            _server = TestServer.Create<Startup>();
        }

        protected HttpRequestMessage CreateRequest(string url, string 
contentType, HttpMethod method)
        {
            HttpRequestMessage request = new HttpRequestMessage
            {
                RequestUri = new Uri(_url + url),
                Method = method
            };
            request.Headers.Accept.Add(new 
System.Net.Http.Headers.MediaTypeWithQualityHeaderValue(contentType));
            return request;
        }
    }
}

控制器测试:

using FluentAssertions;
using NUnit.Framework;
using System.Net;
using System.Net.Http;
using System.Threading.Tasks;

namespace WebApiTest.Tests
{
    [TestFixture]
    public class ControllerTests : BaseTest
    {
        [Test]
        public async Task Test1()
        {
            HttpRequestMessage request = CreateRequest("test", "application/json", HttpMethod.Post);
            HttpResponseMessage response = await _server.HttpClient.SendAsync(request);
            response.StatusCode.Should().Be(HttpStatusCode.OK);
        }
    }
}

我遇到的问题是我无法通过调用await _server.HttpClient.SendAsync(request); 到达我的端点,因为我总是收到404: Not Found 响应。

我不完全确定我做错了什么,无论是不是设置属性的东西还是没有被映射的 Api 路由。

更新:这是我的WebApiConfig.Register()方法供参考:

public static void Register(HttpConfiguration config)
{
    config.MapHttpAttributeRoutes();
    config.Routes.MapHttpRoute(
        name: "DefaultApi",
        routeTemplate: "api/{controller}/{id}",
        defaults: new { id = RouteParameter.Optional }
    );
}

【问题讨论】:

  • 我认为我的 Startup 类中的 WebApiConfig.Register() 调用可以解决这个问题。

标签: c# asp.net integration-testing owin


【解决方案1】:

Web API 配置不正确,因此它不知道路由

如果您使用 OWIN 自托管,请创建一个新的 HttpConfiguration 实例。对此实例进行任何配置,然后将该实例传递给Owin.UseWebApi 扩展方法。

public class Startup {
    public void Configuration(IAppBuilder app) {
        var config = new System.Web.Http.HttpConfiguration();
        WebApiConfig.Register(config);
        app.UseWebApi(config); //<-- THIS WAS MISSING 
    }
}

参考Configuring Web API with OWIN Self-Hosting

【讨论】:

  • 这应该进入我的测试项目还是我的实际 API 项目?
  • 在你的Startup 课堂上
  • 将该行添加到我的Startup 类后,我尝试发布到我的一个控制器并从邮递员那里收到此错误:An error occurred when trying to create a controller of type 'Controller'. Make sure that the controller has a parameterless public constructor.
  • 这通常与创建控制器时的问题有关。您在控制器中使用 DI 吗?
  • 是的,我使用NinjectIUnitOfWorkIMapper 注入到我的控制器中,用于映射DTO 并将记录写入数据库。
【解决方案2】:

我的测试项目似乎不知道我的 API 在启动时所做的所有 DI,因为我的 StartupConfiguration 方法中不包含所有代码。

在我的代码的旧版本中,我的 Configuration 方法中有以下两行:

app.UseNinjectMiddleware(NinjectWebCommon.CreateKernel);
app.UseNinjectWebApi(configuration);

当我从Configuration 方法中删除这两行时,我不明白它们为什么在那里。如果在启动时绑定了依赖项,那么这两行似乎只是多余的。

虽然这是真的,但在从我的 Tests 项目中引用这个 Startup 类的情况下,我需要这两个类,以便我的 Test 项目可以正确处理依赖关系。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2013-11-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-06-26
    • 2020-11-22
    • 1970-01-01
    • 2021-10-18
    相关资源
    最近更新 更多