Как заставить себя работать с 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();
Вы также можете зарегистрировать индивидуальный контроллер при необходимости.