【问题标题】:How to mock data for HttpContext NUnit如何模拟 HttpContext NUnit 的数据
【发布时间】:2015-01-01 11:40:14
【问题描述】:

我已经使用 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 中。所以我不知道如何最小化 HttpContext.Current.Request.RequestContext.so 的数据,请任何人都可以帮助找到解决方案

【问题讨论】:

  • 在构造函数中使用 HttpContext 会使事情变得复杂。通常模拟上下文在创建控制器对象后初始化,即执行 ctor。 Controller.Context = 模拟上下文。你能重构你的代码吗?
  • 你能给出示例代码吗?我尝试了很多方法,但我找不到解决方案,所以如果你能帮助我,请帮助我。
  • 我很乐意提供帮助,但不确定是否可以。代码示例实现了什么?你知道你的代码,所以你只能这样做。您将必须确定如何在稍后阶段使用 HttpContext 推迟。一种选择是在基本控制器中定义一个方法,并在需要该数据时调用。
  • 正如我所注意到的,没有冒犯,但我在您上面粘贴的代码中看到了多个问题。你在 BaseController CTOR 中做了很多事情。你不应该。
  • 我做了这样的事情,_httpContextBase.Setup(x => x.Request.RequestContext.RouteData.GetRequiredString("action")).Returns(baseController.methodforRouteData);但它显示 NotSupportedException

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


【解决方案1】:

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-11-27
    • 2021-11-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多