Я пытаюсь реализовать Microsoft.Owin.Testing/3.0.1 для тестов интеграции WebApi 2. Все работает отлично, за исключением случаев, когда я добавляю attribute routing. Маршруты не распознаются, или я не могу их правильно зарегистрировать. Я уверен, что он имеет какое-то отношение к инъекции зависимостей контроллера api, которая не используется при тестировании.Owin Testing (Self hosting) не регистрирует веб-маршруты api при использовании DI
Мои значения контроллера апи
[RoutePrefix("api")]
public class ValuesApiController : ApiController
{
private readonly ValuesControllerService _valuesControllerService;
public ValuesApiController(ValuesControllerService valuesControllerService)
{
_valuesControllerService = valuesControllerService;
}
// GET api/values
[HttpGet]
[Route("values")]
public async Task<IHttpActionResult> Get()
{
if (_valuesControllerService == null)
throw new ArgumentException("valuesControllerService");
return Ok(new[] { "value1", "value2" });
}
}
Я использую замок Виндзор, чтобы разрешить API контроллеров с использованием (source):
GlobalConfiguration.Configuration.Services.Replace(typeof(IHttpControllerActivator), new WindsorCompositionRoot(_container));
ControllerBuilder.Current.SetControllerFactory(new WindsorControllerFactory(_container));
Я зарегистрировать мои WebAPI маршруты в Global.asax так правильно регистрируются при запуске приложения (а не в тестах).
public class WebApiApplication : HttpApplication
{
protected void Application_Start()
{
GlobalConfiguration.Configure(WebApiConfig.Register);
}
}
При тестировании я вызываю регистрацию после запуска. Вот тестовый образец, который я использую (test source):
[Test]
public async void GetValueTestForStartup1()
{
using (var server = TestServer.Create<Startup1>())
{
using (var client = new HttpClient(server.Handler))
{
var request = await client.GetAsync(_url);
Assert.IsTrue(request.IsSuccessStatusCode);
}
}
}
А вот некоторые реализации запуска я попытался:
internal class Startup1
{
public void Configuration(IAppBuilder app)
{
new Startup().ConfigureForIntegrationTests(app, x => x.Kernel.ComponentModelBuilder.AddContributor(new SingletonEqualizer()));
GlobalConfiguration.Configuration.Services.Replace(typeof(IAssembliesResolver), new TestWebApiResolver());
GlobalConfiguration.Configure(WebApiConfig.Register);
}
}
404 при выполнении запроса
internal class Startup2
{
public void Configuration(IAppBuilder app)
{
new Startup().ConfigureForIntegrationTests(app, x => x.Kernel.ComponentModelBuilder.AddContributor(new SingletonEqualizer()));
GlobalConfiguration.Configure(WebApiConfig.Register);
GlobalConfiguration.Configuration.EnsureInitialized();
}
}
System.InvalidOperationExceptio n: Этот метод не может быть вызван во время фазы инициализации перед запуском приложения.
internal class Startup3
{
public void Configuration(IAppBuilder app)
{
new Startup().ConfigureForIntegrationTests(app, y => y.Kernel.ComponentModelBuilder.AddContributor(new SingletonEqualizer()));
// Web API routes
GlobalConfiguration.Configuration.MapHttpAttributeRoutes();
GlobalConfiguration.Configuration.Routes.MapHttpRoute(
name: "DefaultApi",
routeTemplate: "api/{controller}/{id}",
defaults: new { id = RouteParameter.Optional }
);
app.UseWebApi(GlobalConfiguration.Configuration);
GlobalConfiguration.Configuration.Services.Replace(typeof(IAssembliesResolver), new TestWebApiResolver());
}
}
Внутренняя ошибка сервера
500 (вероятно, потому, что нет конструктор без параметров найден).
Полный sourceproject находится здесь: https://github.com/jvanderbiest/OwinTestingWebApi