0

Я пытаюсь реализовать 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

ответ

1

Существует аналогичный вопрос SO here о AutoFac. Я, должно быть, просмотрел это response, но ключом ко всему этому является регистрация всего с вашим HttpConfiguration вместо использования объекта GlobalConfiguration.

Я обновил github code, поэтому тест теперь работает нормально!

 Смежные вопросы

  • Нет связанных вопросов^_^