1

При попытке блока проверить мой веб-апи проект я получаю ошибкуWeb API Nunit Тесты не инъекционные зависимостей

{[сообщение, произошла ошибка.]} ExceptionMessage, произошла ошибка при попытке создайте контроллер типа «ExampleController». Удостоверьтесь, что контроллер имеет безкоммертный публичный конструктор. {[ExceptionType, System.InvalidOperationException]} {[StackTrace, в System.Web.Http.Dispatcher.DefaultHttpControllerActivator.Create (HttpRequestMessage запрос, HttpControllerDescriptor controllerDescriptor, Тип controllerType) в System.Web.Http.Controllers.HttpControllerDescriptor.CreateController (HttpRequestMessage запрос) на System.Web.Http.Dispatcher.HttpControllerDispatcher.d__1.MoveNext()]} {[InnerException, System.Web.Http.HttpError]}

Единица испытания:

[TestFixtureSetUp] 
public void TestsSetup() 
{ 
    _server = HttpRequestHelper.SetupHttpServerDefault(); 
} 

[Test] 
public void CanGetAllAddresses() 
{ 
    var client = new HttpClient(_server); 

    var request = HttpRequestHelper.CreateRequest("memory/address", HttpMethod.Get, ConfigurationManager.AppSettings["KeyUser"], string.Empty, ConfigurationManager.AppSettings["SecretUser"]); 
    using (HttpResponseMessage response = client.SendAsync(request).Result) 
    { 
     Assert.NotNull(response.Content); 
    } 
} 

Я зарегистрировать мои контроллеры в пределах NUnit TestFixtureSetUp функцию, которая включает в себя эту логику:

public static HttpServer SetupHttpServerDefault() 
{ 
    var config = new HttpConfiguration(); 
    config.Routes.MapHttpRoute(
     name: "DefaultApi", 
     routeTemplate: "memory/{controller}/{id}", 
     defaults: new { id = RouteParameter.Optional } 
    ); 

    var container = new Container(); 
    container.Register<IAddressService, AddressService>(); 
    var services = GlobalConfiguration.Configuration.Services; 
    var controllerTypes = services.GetHttpControllerTypeResolver(). 
      GetControllerTypes(services.GetAssembliesResolver()); 
    foreach (var controllerType in controllerTypes) 
    { 
     var registration = Lifestyle.Transient. 
      CreateRegistration(controllerType, container); 

     container.AddRegistration(controllerType, registration); 

     registration.SuppressDiagnosticWarning 
        (DiagnosticType.DisposableTransientComponent, ""); 
    } 
    container.Verify(); 
    GlobalConfiguration.Configuration.DependencyResolver = new 
        SimpleInjectorWebApiDependencyResolver(container); 
    return new HttpServer(config); 
} 

Мой адрес контроллера начинается так:

public class AddressController : BaseController 
{ 
    private readonly IAddressService _addressService; 

    public AddressController(IAddressService addressService) 
    { 
     _addressService = addressService; 
    } 
} 

При удалении параметров контроллера я могу отлаживать в контроллер, который говорит мне, что я не правильно впрыскиваю зависимости в контроллер. Я просмотрел этот пост here, который кажется похожим, но я не знаком с тем, как я бы явным образом объявлял свои контроллеры. Я попытался использовать аналогичный метод для своих служб, но я не работал.

+0

Просьба также показать тестовый код. – qujck

+0

добавлен тестовый код @qujck. –

+0

проблема связана с ссылкой на GlobalConfiguration и не делает все в переменной 'config', с которой вы создаете' HttpServer'? – qujck

ответ

1

Решение для моей конкретной проблемы состояло в том, чтобы зарегистрировать преобразователь зависимостей как в памяти HttpServer, которую я создаю в тестах, так и на GlobalConfiguration. Выше в этом вопросе, вы увидите создание переменной config, а затем это код, который фиксируется мои вопросы:

config.DependencyResolver = new SimpleInjectorWebApiDependencyResolver(container); 
GlobalConfiguration.Configuration.DependencyResolver = 
        new SimpleInjectorWebApiDependencyResolver(container); 

Без config.DependencyResolver я не смог подключиться к моим проектам контроллеров с помощью:

using (HttpResponseMessage response = client.SendAsync(request).Result) 

И без GlobalConfiguration.Configuration.DependencyResolver Я не смог связаться с местными службами в своем тестовом проекте. Надеюсь, это поможет кому-то еще!

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