Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/280.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
所有测试私有方法的方法似乎都失败了(c#)_C#_Visual Studio 2010_Unit Testing - Fatal编程技术网

所有测试私有方法的方法似乎都失败了(c#)

所有测试私有方法的方法似乎都失败了(c#),c#,visual-studio-2010,unit-testing,C#,Visual Studio 2010,Unit Testing,我想用几个非常基本的私有(非静态)方法来测试这个类,但是…我似乎无法让它工作 下面的代码一直给我以下例外情况: System.MissingMethodException:找不到方法“GeneratorStandard.GetNumber” 测试如下所示: [TestMethod] public void GetNumber01() { var list = GetList(); var generator = new Generator

我想用几个非常基本的私有(非静态)方法来测试这个类,但是…我似乎无法让它工作

下面的代码一直给我以下例外情况:

System.MissingMethodException:找不到方法“GeneratorStandard.GetNumber”

测试如下所示:

    [TestMethod]
    public void GetNumber01()
    {
        var list = GetList();

        var generator = new GeneratorStandard();
        var privateObject = new PrivateObject(generator, new  PrivateType(typeof(Generator)));

        int result = (int)privateObject.Invoke("GetNumber", list);


        Assert.AreEqual(2, result);
    }
Generator是包含方法的抽象基类,GeneratorStandard是继承Generator的实现类

我也尝试过在VS2010中使用“创建私有访问器”按钮,但是它只创建了一个测试引用文件,而不是一个实际的影子类……所以这不起作用

请提供帮助:)

如果抽象“基类”中的方法必须通过从抽象类继承的类型来访问,则它们应该(至少)标记为
受保护的
,而不是
私有的

public abstract class MyClassBase {
   private void DoThis(){}
   protected void DoThat(){}
}

public class MyImplemntation : MyClassBase {

  //I don't know DoThis();
  //I know DoThat();
}
如果抽象“基类”中的方法必须通过从抽象类继承的类型进行访问,则应(至少)将它们标记为
受保护的
,而不是
私有的

public abstract class MyClassBase {
   private void DoThis(){}
   protected void DoThat(){}
}

public class MyImplemntation : MyClassBase {

  //I don't know DoThis();
  //I know DoThat();
}

听着,我不确定您是否试图调用私有成员并对其进行单元测试,但是请记住,这是错误的方法


你应该测试你的公开方法,观察反应、沟通和行为。私有方法只是一个实现细节。

听着,我不确定您是否试图调用私有成员并对其进行单元测试,但是请记住,这是错误的方法


你应该测试你的公开方法,观察反应、沟通和行为。私有方法只是一个实现细节。

要通过反射调用私有方法,您需要指定几个:

BindingFlags.NonPublic
定义成员不是公共的


BindingFlags.Instance
定义成员不是静态的。

要通过反射调用私有方法,您需要指定几个:

BindingFlags.NonPublic
定义成员不是公共的


BindingFlags.Instance
定义成员不是静态的。

好的,您可以使用动态和反射的c-c-c-combo断路器(如果是.net 4或更高版本)来测试您的私有方法。已经有一段时间没有玩过这个游戏了,但这至少可以让你达到80%或更好。


这可能会让你在剩下的过程中达到目的

好吧,您可以使用动态和反射的c-c-c组合断路器(如果是.net 4或更高版本)来测试您的私有方法。已经有一段时间没有玩过这个游戏了,但这至少可以让你达到80%或更好。


这可能会让你在剩下的过程中达到目的

你看过这篇文章了吗


在您的代码中,我会说您必须首先通过privateObject.GetType().GetMethod(“GetNumber”,flags)获取该方法,然后调用它。

您看过这篇文章了吗


在您的代码中,我会说您必须首先通过privateObject.GetType().GetMethod(“GetNumber”,标志)获取该方法,然后调用它。

请定义“fail”。我猜您在阅读时正在更正该问题。您不能访问该私有方法的事实是失败吗?或者这是封装的胜利!请再次查看问题,我添加了例外请定义“失败”。我猜您在阅读时正在更正问题。您无法访问私有方法的事实是失败吗?或者这是封装的胜利!请再看一遍这个问题,我已经添加了一些例外,我知道整个辩论都在讨论:)在这种情况下,这不取决于我……当然:)我明白了,np,这更像是一个提示,而不是一个非常具体的答案:)如果你有太多(有时甚至只是任何)私有方法,这些私有方法中的功能通常可以通过公共方法提取到一个可重用、可测试的类中。是的,我知道关于这一点的整个争论:)在这种情况下,这不取决于我……当然:)我明白了,np,这更像是一个提示,而不是一个非常具体的答案:)如果你有太多(有时甚至只是一个)私有方法,这些私有方法中的功能通常可以通过公共方法提取到一个可重用、可测试的类中。@NeedACar如果不想将方法暴露于继承的类型,请顺便看看ISun的答案。在询问之前,我已经研究过了,但没有太多成功:)@NeedACar它也可以工作(有好的标志)。现在的选择必须是这个问题的答案:这些方法是否应该被继承的类型调用(不仅仅是为了测试)?@NeedACar顺便看看ISun的答案,如果你不想将你的方法暴露给继承的类型。在问之前我已经研究过了,但没有太多成功:)@NeedACar它也可以工作(使用好的标志)。现在,选择必须真正回答这个问题:这些方法是否应该由继承的类型调用(而不仅仅是用于测试)?