Как заставить себя работать с IoC для интеграционных тестов Web-Api?

Отсюда я получил подсказки, чтобы придумать этот интеграционный тест для моего нового проекта Web Api. Я пытаюсь создать веб-сервис для отдыха, и у меня есть вспомогательный клиент, который я планирую выпустить для потребителей API. Это ExampleClientHelper типа там. Ох и кстати, это все провода до ValuesController он поставляется с шаблоном проекта для проекта MVC4 Web Api Visual Studio - я сохраняю вещи простыми, пока проясняю это.

ExampleClientHelper заменяет все запросы / ответы в вышеупомянутом справочном примере. Он использует RestSharp внутри.

[Test]
[Ignore]
public void ValuesHelper_ShouldReturn_value1_And_value2_AsTypedObject()
{
    // IoC prep
    var builder = new ContainerBuilder();
    var container = builder.Build();

    // web server prep
    var baseUri = new Uri("http://localhost:8080");
    var config = new HttpSelfHostConfiguration(baseUri);
    config.DependencyResolver = new AutofacWebApiDependencyResolver(container);

    // yes, the routing needs to be copied over. it's not compatible with the MVC routes
    config.Routes.MapHttpRoute("Api", "api/{controller}/{id}",
        new { id = RouteParameter.Optional, namespaces = new[] { typeof(ValuesController).Namespace } });

    // start the server and make a request
    new HttpSelfHostServer(config)
        .OpenAsync()
        .ContinueWith(task =>
            {
                var client = new ExampleClientHelper(baseUri);
                var values = client.GetValues();

                // then test the response
                Assert.AreEqual("value1", values.ElementAt(0));
                Assert.AreEqual("value2", values.ElementAt(1));
            })
        .Wait();
}

Приведенный выше код работает нормально, если вы не изменяете ValuesController, то есть. у него остается неявный конструктор без параметров.

У меня проблема в том, что сам хост-сервер не может создать экземпляр моего ValuesController когда я изменяю это, чтобы требовать зависимости. Проблема в том, что я получаю то же исключение из ответа моего вспомогательного клиента, подключаю ли я Autofac DependencyResolver или нет. Вот что возвращается в содержании ответа, красиво отформатированном в JSON благодаря RestSharp:

{"ExceptionType": "System.ArgumentException", "Message": "Тип 'Embed.ECSApi.RestServer.Controllers.ValuesController' не имеет конструктора по умолчанию","StackTrace":"в System.Linq.Expressions.Expression. Новый (Тип тип)\r\n в System.Web.Http.Internal.TypeActivator.Create[TBase](Тип instanceType)\r\n в System.Web.Http.Dispatcher.DefaultHttpControllerActivator.Create(запрос HttpRequestMessageD контроллер сценария HttpControl, Введите controllerType)"}

Очевидно, что сам хост-сервер пытается создать ValuesController но это не может Зачем? Я думал, что правильно подключил DependencyResolver. Я ожидаю получить исключение Autofac вместо этого, которое жалуется на мою зависимость, которую я не настроил.

1 ответ

Решение

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

var builder = new ContainerBuilder();

// Register API controllers using assembly scanning.
builder.RegisterApiControllers(typeof(ValuesController).Assembly);

var container = builder.Build();

Вы также можете зарегистрировать индивидуальный контроллер при необходимости.

Другие вопросы по тегам