如何模拟HttpContext NUnit的数据

时间:2014-11-05 10:12:48

标签: asp.net-mvc unit-testing nunit moq nullreferenceexception

我使用NUnit和Moq框架为我的控制器类编写了一个测试类。我的类正在跟随

  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请有人可以帮助找到解决方案

1 个答案:

答案 0 :(得分:2)

您应该创建用于处理HttpContext的包装器实用程序。

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