2014-11-05 57 views
0

我写了一个测试类使用NUnit和起订量framework.My类我的控制器类是以下如何嘲笑数据的HttpContext NUnit的

public class ClientTypeController : BaseController 
    { 
    IClientTypeService clientTypeService; 
    IClientTypeAudService clientTypeAudService; 
    IClientTypeHisService clientTypeHisService; 
    IUserAccountService userAccountService; 
    System.Web.HttpResponseBase _responceBase; 

    public ClientTypeController() 
    { 

    } 

    public ClientTypeController(IClientTypeService _IClientTypeService, IClientTypeAudService _IClientTypeAudService, 
     IClientTypeHisService _IClientTypeHisService,IUserAccountService 
                   _IUserAccountService) 
    { 
     clientTypeService = _IClientTypeService; 
     clientTypeAudService = _IClientTypeAudService; 
     clientTypeHisService = _IClientTypeHisService; 
     userAccountService = _IUserAccountService; 
    } 
    public ClientTypeController(IClientTypeAudService _clientTypeAudService, 
          System.Web.HttpResponseBase responceBas) 
    { 
     clientTypeAudService = _clientTypeAudService; 
     this._responceBase = responceBas; 
    } 
    ...... 
     ..... 

而且我的测试类上面给出的控制器类,

public class ClientTypeControllerTest 
    { 
    private Mock<IClientTypeService> _clientTypeServiceMock; 
    private Mock<IClientTypeAudService> _clientTypeAudServiceMock; 
    private Mock<IClientTypeHisService> _clientTypeHisServiceMock; 
    private Mock<HttpSessionStateBase> _sessionMock; 
    private Mock<HttpResponseBase> _httpresponceMock; 
    private Mock<IUserAccountService> _userAccountService; 

    ClientTypeController objClientTypeController; 
    protected Users LoggedInUser { get; set; } 
    List<ClientTypeAud> lists; 


    [SetUp] 
    public void Initialize() 
    { 
     //System.Diagnostics.Debugger.Launch(); 
     _clientTypeServiceMock = new Mock<IClientTypeService>(); 
     _clientTypeAudServiceMock = new Mock<IClientTypeAudService>(); 
     _clientTypeHisServiceMock = new Mock<IClientTypeHisService>(); 
     _userAccountService = new Mock<IUserAccountService>(); 
     _sessionMock = new Mock<HttpSessionStateBase>(); 
     _httpresponceMock = new Mock<HttpResponseBase>(); 
     var ctrlContext = new Mock<ControllerContext>(); 

     AutoMapperConfiguration.Configure(); 
     _sessionMock.SetupGet(s => s["LOGGED_IN_USER"]).Returns(users); 
     ctrlContext.Setup(p => p.HttpContext.Session).Returns(_sessionMock.Object); 

    } 



    [Test] 
    public void Show_AllClientTypeRecords_InGridView_UnitTest() 
    { 
     lists = new List<ClientTypeAud>() { 
     new ClientTypeAud() { Id = 1, CTypeName = "INR", CompanyId = 1, Active = "Y" }, 
     new ClientTypeAud() { Id = 1, CTypeName = "ABC", CompanyId = 1, Active = "Y" }, 
     new ClientTypeAud() { Id = 1, CTypeName = "AVM", CompanyId = 1, Active = "Y" } 
     }; 

     _clientTypeAudServiceMock.Setup(x => x.All()).Returns(lists.AsQueryable()); 
     objClientTypeController = new ClientTypeController(_clientTypeServiceMock.Object, 
         _clientTypeAudServiceMock.Object, _clientTypeHisServiceMock.Object, 
                  _userAccountService.Object); 

    var result = objClientTypeController.GridData("", "asc", 1, 1) as JsonResult; 
     Assert.IsNotNull(result.Data); 
    } 
    } 

而且我BaseController类,

public class BaseController : Controller 
    { 
    public SessionProvider SessionProvider; 
    protected Users LoggedInUser { get; set; } 

    public string actionName { get; set; }   
    protected string controllerName { get; set; } 
    protected string area { get; set; } 

    public BaseController() 
    { 
     actionName = 
System.Web.HttpContext.Current.Request.RequestContext.RouteData.GetRequiredString("action"); 
     controllerName = 
      System.Web.HttpContext.Current.Request.RequestContext.RouteData. 
                GetRequiredString("controller"); 
     SessionProvider = new SessionProvider(Session); 
     LoginMethod();    
     ViewBag.Menu = BuildMenu(); 

    } 
...... 
...... 

当我运行使用NUnit我的测试类那么它显示的NullReferenceException是由用户代码未处理的

actionName = System.Web.HttpContext.Current.Request.RequestContext. 
           RouteData.GetRequiredString("action"); 

这是我BaseControllerClass。所以我不知道如何Moq的数据为HttpContext.Current.Request.RequestContext.so请任何人都可以请帮忙找到解决方案

+0

通过在构造函数中使用HttpContext可以使事情变得复杂。在创建控制器对象(即,ctor被执行)之后,通常模拟的上下文被初始化。 Controller.Context = mockedContext。你能重构你的代码吗? – SBirthare 2014-11-05 12:10:51

+0

你可以给它提供示例代码吗?我在很多方面尝试过,但我找不到解决方案,所以请如果你能帮忙,那么请帮助我。 – 2014-11-05 12:19:36

+0

我会很乐意帮忙,但不知道我可以。代码示例实现什么?你知道你的代码,所以你只能做到这一点。你将不得不决定如何推迟在后期使用HttpContext。一种选择是在基本控制器中定义一个方法,并在需要该数据时调用。 – SBirthare 2014-11-05 12:24:34

回答

2

你应该创建包装实用程序来处理HttpContext。

这个包装应该实现一个接口,在你的UT你应该嘲笑那个调用(你可以使用Rhino Mocks)。

+0

您可以举一些示例代码?请帮帮我 – 2014-11-13 10:00:17