【问题标题】:Can an ASP.NET MVC project with attribute routing be tested?可以测试带有属性路由的 ASP.NET MVC 项目吗?
【发布时间】:2014-09-23 16:52:01
【问题描述】:

我花了几天时间尝试模拟、存根和伪造我的可测试应用程序。我通常不测试控制器动作,而是测试我所有的其他类和模式。

我撞到的墙是新的属性路由功能。虽然我可以使用路由类来注册我的规则等。但在调用 MapMvcAttributeRoutes 时出现此错误。

在应用程序的预启动初始化阶段不能调用此方法

这里讨论。

MapMvcAttributeRoutes: This method cannot be called during the application's pre-start initialization phase

说实话,我无法理解答案。不是代码,而是碎片化的版本、指向其他错误的链接、GitHub 等。

我对底线答案有点迷茫:

截至 2014 年 10 月 23 日。是否可以在测试条件下注册所有路由,我需要什么版本的 MVC 以及我需要调用哪些类/方法?

目前,我使用UrlHelper 的课程搞砸了,因为缺少所需的路线。我正在注入子类来绕过这个问题,但我认为伪造运行时 MVC 环境并让我的应用程序在没有大量 DI 杂技的情况下运行是不合理的。

如果这些是框架本身中的一个简单助手会很好,它可以接受描述原始 HTTP 请求的 JSON 对象并正确创建 Controller、HttpContext、ControllerContext 等就好像这是一个真正的在线请求。

谢谢,

卢克

【问题讨论】:

  • 虽然这适用于 WebApi,但我认为它应该可以工作.. 它使用模拟 UrlHelper...asp.net/web-api/overview/testing-and-debugging/…
  • 目前,我要么模拟UrlHelper,要么我有一个HyperlinkModel 来表示一个链接,我将我的HyperlinkModelBuilder 子类化并伪造主链接构建逻辑。

标签: c# asp.net asp.net-mvc unit-testing


【解决方案1】:

好问题,我认为答案是在框架的这一部分设计中很少或根本没有考虑测试路线。可能有一些方法可以测试路由,但是当新版本的 MVC 发布时,它们将是间接的、未记录的并且容易中断。

I have a blog post here 关于我在这个话题上的经历。我也建议你也campaign for better testability in ASP vNext in the public issue tracker

【讨论】:

    【解决方案2】:

    在每日站立会议期间,一位同事提到他正在通过内存网络服务器进行集成测试。很感兴趣,他向我展示了如何,我很惊讶,学到了一些东西:-)

    您可以新建一个HttpServer 实例并让它读取您的配置,然后调用服务器实例。我还没有尝试过,但我看不出为什么它不能枚举你的路由和需要正确配置的代码都可以工作。

    这个 SO 问题是相关的,可能有助于如何设置:

    How does the In-Memory HttpServer know which WebAPI project to host?

    【讨论】:

    • 这可能会减少集成测试,但不适用于单元测试:设置将花费太多时间。
    • 我们可以就什么是单元测试和隔离进行哲学辩论,您可能有一些公平的观点,但随着时间的推移,在实践中,我们发现它很好。
    猜你喜欢
    • 2019-05-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-07-16
    • 1970-01-01
    相关资源
    最近更新 更多