所有测试私有方法的方法似乎都失败了(c#)
我想用几个非常基本的私有(非静态)方法来测试这个类,但是…我似乎无法让它工作 下面的代码一直给我以下例外情况: System.MissingMethodException:找不到方法“GeneratorStandard.GetNumber” 测试如下所示:所有测试私有方法的方法似乎都失败了(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
[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它也可以工作(使用好的标志)。现在,选择必须真正回答这个问题:这些方法是否应该由继承的类型调用(而不仅仅是用于测试)?