Интеграционное тестирование - Как поразить конечные точки с помощью Microsoft.Owin.Testing.TestServer? - PullRequest
2 голосов
/ 19 июня 2019

Я настроил базовый проект веб-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, который содержит один тест с целью отправки веб-запроса на выше TestController х GET Метод действия:

BaseTest:

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

ControllerTests:

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.

Я не совсем уверен, что я делаю не так, будь то что-то, что не является свойством setup, или маршруты 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 }
    );
}

Ответы [ 2 ]

1 голос
/ 27 июня 2019

Похоже, что мой проект Tests не знал обо всех DI, которые мой API делал при запуске, так как весь код для этого не содержался в моем методе Startup Configuration.

В более старой версии моего кода у меня были следующие две строки в моем методе Configuration:

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

Когда я удалял эти две строки из метода Configuration, я не понимал, почему они былитам.Если зависимости запускаются при запуске, может показаться, что эти две строки просто избыточны.

Хотя это и так, в случае ссылки на этот класс Startup из моего проекта Tests, мне нужны обе этипоэтому мой тестовый проект может правильно обрабатывать зависимости.

1 голос
/ 20 июня 2019

Веб-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 
    }
}

Ссылка Настройка веб-API с OWIN Self-Hosting

...