gpt4 book ai didi

dependency-injection - 如何让自托管与 IoC 配合进行 Web-Api 集成测试?

转载 作者:行者123 更新时间:2023-12-03 01:28:25 24 4
gpt4 key购买 nike

我已经采取了hints from here为我的新 Web Api 项目进行集成测试。我正在尝试构建一个 REST Web 服务,并且我有一个帮助客户端,我计划将其发布给 API 消费者。这就是其中的 ExampleClientHelper 类型。哦,顺便说一句,这一切都连接到随 MVC4 Web Api Visual Studio 项目的项目模板提供的 ValuesController - 我在阐述这一点时保持简单。

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,上面的代码就可以正常工作。 IE。它仍然具有隐式无参数构造函数。

我遇到的问题是,当我修改它以需要依赖项时,自托管服务器似乎无法实例化我的 ValuesController 。问题是,无论我连接 Autofac DependencyResolver,我都会从帮助程序客户端的响应中得到相同的异常。或不。这是响应内容中返回的内容,由于 RestSharp,它的格式很好地为 JSON:

{"ExceptionType":"System.ArgumentException","Message":"Type 'Embed.ECSApi.RestServer.Controllers.ValuesController' does not have a default constructor","StackTrace":" at System.Linq.Expressions.Expression.New(Type type)\r\n at System.Web.Http.Internal.TypeActivator.Create[TBase](Type instanceType)\r\n at System.Web.Http.Dispatcher.DefaultHttpControllerActivator.Create(HttpRequestMessage request, HttpControllerDescriptor controllerDescriptor, Type controllerType)"}

很明显,自主机服务器正在尝试创建 ValuesController 但它不能。为什么?我认为我正确连接了 DependencyResolver。我期望得到一个 Autofac 异常,而不是提示我尚未配置的依赖项。

最佳答案

您似乎忘记了向容器注册 Controller ,并且 Web API 正在尝试为您创建实例。

var builder = new ContainerBuilder();

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

var container = builder.Build();

如果需要,您还可以注册单个 Controller 。

关于dependency-injection - 如何让自托管与 IoC 配合进行 Web-Api 集成测试?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11666230/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com