![]() |
1
2
如果您希望类是可测试的,那么不要在那里使用不可测试(外部)组件。当你试图取笑他们时,你只是在设计不好的地方工作。改为重新设计控制器。类不应依赖外部/全局对象。这就是为什么使用国际奥委会的原因之一。 您有两个选择来将实现/基础结构细节与控制器分开:
在后一种情况下,接口在会话上添加了语义——强类型、命名良好的属性。这就像使用nhibernate域实体而不是sqlreader[“db_column_name”]。 然后,当然,将接口的HTTP实现(例如,使用httpcontext.current)注入控制器。 模型绑定也是一个很好的方法,就像动作过滤器一样。他们是 not just for form data . |
![]() |
2
3
只是
use a mock framework to create a mock HttpSessionStateBase
并将其注入控制器上下文。用犀牛嘲笑,
this would be created
使用
|
![]() |
3
1
有两种方法——要么使用自定义过滤器属性将会话值注入控制器操作,要么使用可模拟的接口创建会话对象并将其注入控制器的构造函数。 下面是自定义筛选器的示例。
以及在控制器中使用它的方法:
您选择哪一个可能取决于您对会话值的依赖程度,但这两种方法都是相对可测试的。 |
![]() |
4
1
您不能在应用程序启动时将任何内容存储到会话。会话=客户端启动的交互。在应用程序启动时,您没有针对所有客户机的会话。 控制器通常不直接与会话交互-它使控制器依赖于会话。相反,控制器方法(操作)接受通过创建自定义ModelBinder从会话中自动填充的参数。简单例子:
您将在应用程序启动(global.asax)中注册活页夹:
你的行为定义如下:
正如您所看到的,控制器绝不依赖于会话,它是完全可测试的。 |