如何将c#中的私有方法与PrivateObject联合测试

如何将c#中的私有方法与PrivateObject联合测试,c#,unit-testing,private-methods,C#,Unit Testing,Private Methods,我试图对一个私有方法进行一个简单的单元测试,我让VS2010自动生成方法stubb并添加缺少的信息:这是我的代码 [TestMethod()] [DeploymentItem("MyPackage.Language.dll")] public void getValidCultureWithValidInputCulture() { CultureInfo culture = new CultureInfo("sv-SE",

我试图对一个私有方法进行一个简单的单元测试,我让VS2010自动生成方法stubb并添加缺少的信息:这是我的代码

[TestMethod()]
        [DeploymentItem("MyPackage.Language.dll")]
        public void getValidCultureWithValidInputCulture()
        {
            CultureInfo culture = new CultureInfo("sv-SE", false);
            PrivateObject param0 = new PrivateObject(culture, new PrivateType(typeof(CultureInfo)));
            GlobalResourceProvider_Accessor target = new GlobalResourceProvider_Accessor(param0);
            CultureInfo expected = new CultureInfo("sv-SE", false); 
            CultureInfo actual = target.getValidCulture(culture);
            Assert.AreEqual(expected, actual);
            Assert.Inconclusive("Verify the correctness of this test method.");
        }
当我运行此命令时,会出现一个异常:

System.ArgumentException: 
      The member specified (getValidCulture) could not be found. You might need to regenerate your private accessor,
      or the member may be private and defined on a base class. If the latter is true, you need to pass the type
      that defines the member into PrivateObject's constructor.
有人知道我做错了什么吗?我的目标是学习如何使用PrivateType和PrivateObject进行私有方法测试

编辑:


我不想使用PrivateObject.Invoke(它不支持重构)。

我遇到了同样的问题。为了纠正这个问题,我确保
Local.testsettings
TraceAndTestImpact.testsettings
都在“数据和诊断”选项中选择了正确的文件(
Debug
Release
,等等)


这是指您具有上的代码覆盖率或允许选择要使用的程序集的任何设置。选择正确的集合,编译并再次尝试单元测试。有时需要重新创建访问器。我也有一个基类,但它似乎可以与任何
公共静态
方法配合使用。

我认为,您根本不应该对私有内容进行单元测试。您的测试应该围绕公共API的行为,而不是私有方法的实现细节。如果说有什么区别的话,私人方法就是支持某些公共行为的内部助手。我们测试非公共方法时做的一件事是让它们受到保护,而不是私人的。然后让测试类从中派生出来,这样它就可以访问这些方法。这不是最好的方法,因为我们不得不将修饰符改为protected,但它完成了任务。@Paul我不同意你的观点,但这与这个问题无关。@VishalKumar是的,我通常也是这么做的,但后来我听说了这个奇特的东西,并想学习如何使用它。@VishalKumar我认为
受保护的
不是一个好主意,因为非密封类上的
受保护的
成员是该类的公共表面区域的一部分。IMO
internal
InternalsVisibleTo
是一个更好的选择。