AttributeRouting 不适用于 HttpConfiguration 对象来编写集成测试 [英] AttributeRouting not working with HttpConfiguration object for writing Integration tests

查看:18
本文介绍了AttributeRouting 不适用于 HttpConfiguration 对象来编写集成测试的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我正在按照此处概述的想法创建一些集成测试:http://www.strathweb.com/2012/06/asp-net-web-api-integration-testing-with-in-memory-hosting/

I'm creating some integration tests following the ideas outlined here: http://www.strathweb.com/2012/06/asp-net-web-api-integration-testing-with-in-memory-hosting/

当我尝试从手工制作的 HttpConfiguration 对象注册路由时,出现以下错误:具有路由模板 'api/Contacts/{id}' 的路由上的约束条目 'inboundHttpMethod' 必须具有字符串值或者是实现 'IHttpRouteConstraint' 的类型."

When I try to register routes from a hand crafted HttpConfiguration object I'm getting the following error: "The constraint entry 'inboundHttpMethod' on the route with route template 'api/Contacts/{id}' must have a string value or be of a type which implements 'IHttpRouteConstraint'."

示例代码:控制器:

 [RoutePrefix("api")]
    public class ContactsController : ApiController
    {
        [GET("Contacts/{id}",RouteName="GetContactsById")]
        public ContactDTO Get(int id)
        {
      return new ContactDTO{ ID =1, Name="test"};
        }
    }
}

测试类(MSTest):

TestClass (MSTest):

 [TestClass]
    public class ContactsTest
    {
        private string _url = "http://myhost/api/";
        private static HttpConfiguration config = null;
        private static HttpServer server = null;
        private HttpRequestMessage createRequest(string url, string mthv, HttpMethod method)
        {
             var request = new HttpRequestMessage();
            request.RequestUri = new Uri(_url + url);
            request.Headers.Accept.Add(new MediaTypeWithQualityHeaderValue(mthv));
            request.Method = method;
            return request;
        }
        private HttpRequestMessage createRequest<T>(string url, string mthv, HttpMethod method, T content, MediaTypeFormatter formatter) where T : class
        {
            HttpRequestMessage request = createRequest(url, mthv, method);
            request.Content = new ObjectContent<T>(content, formatter);

            return request;
        }

        [ClassInitializeAttribute]
        public static void ClassInitialize(TestContext ctx)
        {
            config = new HttpConfiguration();
            config.IncludeErrorDetailPolicy = IncludeErrorDetailPolicy.Always;
            config.Services.Replace(
                typeof(IDocumentationProvider), new DocProvider());

            config.Services.Replace(
                typeof(IApiExplorer),
                new VersionedApiExplorer(config));

            config.Services.Replace(
                typeof(IHttpControllerSelector),
                new VersionHeaderVersionedControllerSelector
                    (config)
                    );
            AttributeRoutingHttpConfig.RegisterRoutes(config.Routes);
            WebApiConfig.Register(config);
            server = new HttpServer(config);
        }

        public static void ClassCleanup()
        {
            config.Dispose();
            server.Dispose();
        }

        [TestMethod]
        public void RetrieveContact()
        {
            var request = createRequest("Contacts/12","application/json",HttpMethod.Get);
            var client = new HttpClient(server);

            using (HttpResponseMessage response = client.SendAsync(request).Result)
            {
                Assert.IsNotNull(response.Content);
            }
        }
    }

错误发生在client.SendAsync"行上.我检查了 config.Routes 和inboundHttpMethod"的Constraints"的数据类型是 AttributeRouting.Web.Http.WebHost.Constraints.InboundHttpMethodConstraint似乎需要一个字符串值.任何帮助将不胜感激.

The error occurs on the line "client.SendAsync". I inspected config.Routes and the datatype for the "Constraints" for ''inboundHttpMethod' ' is AttributeRouting.Web.Http.WebHost.Constraints.InboundHttpMethodConstraint It appears that a string value is expected. Any help would be much appreciated.

推荐答案

遇到了同样的问题.在这里找到答案:

Had the same problem. Found the answer here:

https://github.com/mccalltd/AttributeRouting/issues/191

你需要更换

AttributeRoutingHttpConfig.RegisterRoutes(config.Routes);

config.Routes.MapHttpAttributeRoutes(cfg =>
{
   cfg.InMemory = true;
   cfg.AutoGenerateRouteNames = true;
   cfg.AddRoutesFromAssemblyOf<ContactsController>();// Or some other reference...
});

我发现我也需要 AutoGenerateRouteNames 部分.

I found I also needed the AutoGenerateRouteNames part, too.

这篇关于AttributeRouting 不适用于 HttpConfiguration 对象来编写集成测试的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆