首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >AttributeRouting不使用HttpConfiguration对象编写集成测试

AttributeRouting不使用HttpConfiguration对象编写集成测试
EN

Stack Overflow用户
提问于 2013-09-13 04:37:58
回答 1查看 4K关注 0票数 8

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

当我尝试从手工构建的HttpConfiguration对象注册路由时,我会得到以下错误:“带有路由模板‘api/inboundHttpMethod/{id}’的约束条目'inboundHttpMethod‘必须有一个字符串值,或者是实现’IHttpRouteConstraint‘的类型。”

示例代码:控制器:

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

TestClass (MSTest):

代码语言:javascript
复制
 [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“上。我检查了AttributeRouting.Web.Http.WebHost.Constraints.InboundHttpMethodConstraint,并检查了config.Routes的“约束”的数据类型,其中显示了一个字符串值。任何帮助都将不胜感激。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2013-09-30 14:55:34

也有同样的问题。在这里找到答案:

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

你需要替换

代码语言:javascript
复制
AttributeRoutingHttpConfig.RegisterRoutes(config.Routes);

使用

代码语言:javascript
复制
config.Routes.MapHttpAttributeRoutes(cfg =>
{
   cfg.InMemory = true;
   cfg.AutoGenerateRouteNames = true;
   cfg.AddRoutesFromAssemblyOf<ContactsController>();// Or some other reference...
});

我发现我也需要AutoGenerateRouteNames部分。

票数 14
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/18778390

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档