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

时间:2019-06-19 20:07:46

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

我已经通过以下设置设置了一个基本的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!");
        }
    }
}

对于我的Tests项目,我正在使用NUnit进行测试,它有两个类:抽象的BaseTest类和ControllerTests类,其中包含一个旨在发送的测试来自上述TestController的{​​{1}}操作方法的网络请求:

BaseTest:

GET

ControllerTests:

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);响应。

我不确定是我做错了什么,无论是不是设置属性还是未映射的Api路由。

更新:这是我的404: Not Found方法供参考:

WebApiConfig.Register()

2 个答案:

答案 0 :(得分: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

答案 1 :(得分:1)

由于我的Startup的{​​{1}}方法中没有包含所有的代码,因此我的Tests项目似乎不知道API在启动时所做的所有DI操作。

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

Configuration

返回时,我从app.UseNinjectMiddleware(NinjectWebCommon.CreateKernel); app.UseNinjectWebApi(configuration); 方法中删除了这两行,但我不明白它们为什么在那里。如果在启动时绑定依赖项,则似乎这两行只是多余的。

虽然的确如此,但在从我的Tests项目引用此{​​{1}}类的情况下,我需要两个都可以,以便我的Test项目可以正确处理依赖项。