集成测试 - 如何使用 Microsoft.Owin.Testing.TestServer 访问端点



我已经设置了一个基本的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类,目的是将Web请求发送到上述TestControllerGET Action方法:

基础测试:

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 }
    );
}

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 
    }
}

参考使用 OWIN 自承载配置 Web API

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

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

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

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

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

相关内容

  • 没有找到相关文章

最新更新