如何解决由HttpContext抛出的空引用异常.c#单元测试项目中的Session(在Controller方法中)

本文关键字:项目 单元测试 何解决 方法 Controller 异常 Session 引用 HttpContext 解决 | 更新日期: 2023-09-27 18:02:53

我有一个mvc项目,我想写单元测试方法来测试控制器方法。我不想简单地测试控制器是否返回正确的视图,我想测试由partialViewResult返回的模型对象。下面是控制器方法。这将向视图返回一个模型对象以填充网格。我想测试它是否在partialview中的模型对象中返回10条记录。

 public ActionResult productGrid (string pID = null)
{
   List<product> listproductModel = new List<product>();
   List<productModel> listviewproductModel = new List<productModel>();
   try {
   listproductModel = GetProductDetails(string.IsNullOrEmpty(pId) ? 0 : Convert.ToInt32(pId));
   if (listproductModel != null)
            {
                Mapper.Map(listproductModel, listViewproductModel); // Using Auto mapper to map 
            }
     HttpContext.Session["ProductList"] = listViewproductModel;
        }
        catch (Exception ex)
        {
            this.WriteLog(LogType.ERROR, ex.Message, ex);
            throw ex;
        }
        return PartialView("_productGrid", listViewproductModel);
    }

下面是单元测试方法(我是一个新手,所以它可能有很多错误)。我稍微改变了一下测试方法。它能够检查由控制器方法返回给视图的模型对象中的记录数,但正在发生另一个错误。请查看以下代码查看详细信息。

  public void productGridTest()
    {
        string platformId = null;
        var obj = new ProductController();
        var result = obj.productGrid(platformId) as PartialViewResult;
        Assert.AreEqual(true, ((IList<productModel>)result.ViewData.Model).Count == 10, "Error");
    }

其中,productModel是包含产品详细信息的模型对象。

当我输入 时,上面的测试方法可以正常工作。
  HttpContext.Session["ProductList"] = listViewproductModel;

在COMMENTS中的控制器方法中(换句话说,禁用语句)。否则,由于该语句,它返回空引用异常。请帮助我解决这个错误!谢谢!:)

如何解决由HttpContext抛出的空引用异常.c#单元测试项目中的Session(在Controller方法中)

您的控制器名称仅为"Controller"?你需要你想要测试的控制器,而不是通用的。例如,如果我有一个UserController要测试:

var controller = new UserController()
var result = controller.productGrid("");
Assert.IsNotNull(result);
var viewResult = result as PartialViewResult;
var hasErrors = controller.ModelState.Values.Any(d => d.Errors.Any());
Assert.IsFalse(hasErrors);
Assert.IsInstanceOf<PartialViewResult>(result);
Assert.IsNotNull(viewResult);
Assert.AreEqual(true, result.ViewData.Count > 0);