最近有个项目求助,由于开发人员把页面处理的相关逻辑写到了Controller层里,需要增加对Controller层的单元测试。
我看了下Controller层里难于测试的原因主要是httpcontext类难模拟。Controller层用到了session,request信息。
我的解决方法是,在httpcontext与Controller之间增加一个IHttpContextRepository接口,它负责将httpcontext里的内容封装到model里传给Controller。
那么Controller层只和Model层打交道。
定义IHttpContextRepository接口
public interface IHttpContextRepository
{
LogOnModel GetLogOnModel(HttpContextBase context);
string GetAgent(HttpContextBase context);
}
定义BaseController,所有的业务Controller派生于BaseController,BaseController内有一个依赖属性IHttpContextRepository。
public class BaseController : Controller
{
protected IHttpContextRepository httpContextRepository;
public BaseController(IHttpContextRepository prepareControllerVar)
{
httpContextRepository = p