Unit testing 如何对私有财产进行单元测试?

Unit testing 如何对私有财产进行单元测试?,unit-testing,asp.net-mvc-4,mocking,Unit Testing,Asp.net Mvc 4,Mocking,我正在ASP.NETMVC4应用程序中对我的一个动作方法进行单元测试 问题是该控制器的操作方法中有一个私有属性。以下是私有属性和方法的代码:- 私人财产: private int ProductId { get { return Convert.ToInt32(System.Web.HttpContext.Current.Session["FKProductID"]); } set { System.Web.HttpContext.Current.

我正在ASP.NETMVC4应用程序中对我的一个动作方法进行单元测试

问题是该控制器的操作方法中有一个私有属性。以下是私有属性和方法的代码:-

私人财产:

    private int ProductId
    {
        get { return Convert.ToInt32(System.Web.HttpContext.Current.Session["FKProductID"]); }
        set { System.Web.HttpContext.Current.Session["FKProductID"] = value; }
    }
方法:

    public ActionResult GetDetails(string Name, int area, int ProdCategoryId = 0)
    {

        ProductCategoryViewModel model = new ProductCategoryViewModel
        {
            Area= area,
            FKProductID = ProductId, //private property

        };


       else if (model.FKProductID > 0)
       {
           ProductDto product= ProductService.GetProductDetails(model.FKProductID);

       }
单元测试方法代码:

    public void SelectProductTest()
    {
            // Act           
            var result = controller.GetDetails(name,area, prodcatid) as PartialViewResult;

    }
因为我在测试方法中通过了三个必需的参数,但我在私有属性位置上遇到了问题(当控件丰富时)


有人能告诉我如何处理这种情况吗?

私有代码不能通过设计从外部访问-这就是
Private
关键字的全部要点。所以没有办法测试它


相反,通常的方法是将属性声明为
internal
,然后通过属性授予测试程序集访问权限。这样,您就不会破坏封装,因为
内部
成员在其他方面的行为与
私有
成员完全相同。

您可以使用反射来获取以下数据:

语言/技术不同,但方法相同

在.Net上:

真实背景:

我们接管了一个由一群学生设计和实施的项目。没有任何文件。作者们早就逃跑了。客户希望扩展具有向后兼容性的功能。为了保持向后兼容性,您必须执行不可用的测试。嗯,这里迟早需要测试私有变量。你测试他们,让他们理解这个项目,看看你没有破坏它

对我来说,说测试不应该检查私人财产是学术上的胡说八道

编写缺失的测试、使用陷阱和实现需求等。使用“CodeContract”方法可以让您掌握项目,否则您将走错方向


对不起,我说的是英语。

。你在模拟会话吗?不,没有模拟。原则上你不应该测试私有属性,因为你的客户端代码也不能直接看到它们。不过,我不知道你的情况有什么问题-你发布的代码应该可以正常工作(尽管我质疑在模型类中直接使用
System.Web.HttpContext
。@Pawan..当你不模拟Sessionn时,你显然会得到一个错误,即使它可能是公共属性或私有属性,您需要以某种方式模拟正在使用的会话。模拟是必需的,因为在运行单元测试时,您并没有实际运行应用程序,所以不会有任何会话数据,它必须在会话可用的假设下运行。这就是模拟出现在图片中的地方。@CompuChip。……当控件到达模型(ProductCategoryViewModel)属性部分并转到私有属性语句(FKProductID=ProductId)时,问题出现在单元测试时然后获取其值0。前面有一个条件检查if中的private ProductId。您可以在更新的帖子中看到这一点。