【问题标题】:How to unit test library that relies on Session object如何对依赖 Session 对象的库进行单元测试
【发布时间】:2010-10-03 03:24:09
【问题描述】:

我有几个使用相同控制器和模型的 asp.net mvc 网站。
这个通用逻辑放在单独的库中。 这些库使用 HttpContext.Current.Session。如何使这些单元可测试? 我阅读了有关 StateValue 的信息,但无法完全掌握它。我应该从哪里得到这个 StateValue 东西?它是我引用的库吗?

【问题讨论】:

标签: asp.net-mvc unit-testing session


【解决方案1】:

您可以使用模拟助手,例如看到here

【讨论】:

  • 我发现在这种情况下使用起订量非常容易。 +1 给你。
【解决方案2】:
  1. 您的代码应该使用 IHttpSessionState 而不是 HttpSessionState。
  2. 如果您查找 IHttpSessionState 的 MSDN 文档,您会发现一个示例实现,您可以将其提升到您的单元测试项目中以创建模拟会话。
  3. 将获取 Session 的代码替换为返回 IHttpSessionState 的静态委托。
  4. 使用使用 HttpContext.Current.Session 的函数初始化该静态委托。
  5. 在单元测试期间,将委托替换为 IHttpSessionState 的 Mock 实现。

【讨论】:

  • 虽然这听起来很棒,但它需要我编写一个完整的 IHttpSessionState 模拟。虽然我引用的这个 StateValue 似乎为我提供了一个系统,我不必再关心是否有会话。
  • 既然你已经有了一个代码库,我想你会发现复古拟合这个 StateValue 东西比模拟 Session 对象更有效。尤其是文档为您提供了一个很好的基础来开始创建模拟。
【解决方案3】:

只是为了引导人们走出这个天坑(从 .NET 3.5 开始)——不要为了模拟和测试而触摸 IHttpSessionState:

http://www.codemerlin.com/2011/07/mocking-httpcontext-httpresponse-httprequest-httpsessionstate-etc-in-asp-net/

【讨论】:

    猜你喜欢
    • 2014-05-29
    • 2013-09-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多