加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

依赖注入 – 如何让自托管与IoC一起使用以进行Web-Api集成测试?

发布时间:2020-12-14 04:50:57 所属栏目:百科 来源:网络整理
导读:我已经花了 hints from here为我的新Web Api项目提出了这个集成测试.我正在尝试构建一个休息Web服务,并且我有一个帮助客户端,我打算将其发布给API使用者.这就是那里的ExampleClientHelper类型.哦,顺便说一句,这一切都连接到为MVC4 Web Api Visual Studio项目
我已经花了 hints from here为我的新Web Api项目提出了这个集成测试.我正在尝试构建一个休息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,上面的代码就可以正常工作.即.它仍然具有隐式无参数构造函数.

我遇到的问题是,当我修改它以要求依赖时,自我主机服务器似乎无法实例化我的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)rn at System.Web.Http.Internal.TypeActivator.Create[TBase](Type instanceType)rn at System.Web.Http.Dispatcher.DefaultHttpControllerActivator.Create(HttpRequestMessage request,HttpControllerDescriptor controllerDescriptor,Type controllerType)”}

很明显,自主服务器正在尝试创建ValuesController,但它不能.为什么?我以为我正确连接了DependencyResolver.我期待得到一个Autofac异常而不是抱怨我没有配置的依赖.

解决方法

看起来您忘记使用容器注册控制器,Web API正在尝试为您创建实例.

var builder = new ContainerBuilder();

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

var container = builder.Build();

如果需要,您还可以注册单个控制器.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读