我想用几个非常基本的私有(非静态)方法来测试这个类,但是......我似乎无法使它工作。
以下代码一直给我以下例外:
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中的“创建私人访问者”按钮,但是它只创建了一个测试参考文件,但没有创建实际的阴影类...所以它不起作用。
请帮助:)
答案 0 :(得分:2)
如果抽象“base”类的方法必须可以通过从抽象类继承的类型访问,那么它们应该(至少)标记为protected
,而不是private
。
public abstract class MyClassBase {
private void DoThis(){}
protected void DoThat(){}
}
public class MyImplemntation : MyClassBase {
//I don't know DoThis();
//I know DoThat();
}
答案 1 :(得分:2)
要通过反射调用私有方法,您需要指定几个BindingFlags:
var instance = new Foo();
var type = instance.GetType();
var meth = type.GetMethod("PrivateMeth", BindingFlags.NonPublic | BindingFlags.Instance);
if(meth != null)
meth.Invoke(instance, new object[0] { });
BindingFlags.NonPublic
定义该成员不公开。
BindingFlags.Instance
定义该成员不是静态的。
答案 2 :(得分:1)
看,我不确定如果您正在尝试调用私有成员并对其进行单元测试,请记住这是错误的方法。
您应该测试您的公共方法并观察响应,沟通和行为。私有方法只是一个实现细节。
答案 3 :(得分:0)
好吧,你可以使用动态和反射的c-c-c-combo断路器(如果这是.net 4或更好)来测试你的私有方法。有一段时间没有参加过这场比赛,但这应该让你至少有80%或更好
Testing private methods with C# 4
这可能会让你在那里继续前行。
Use C# dynamic typing to conviently access internals of an object.
答案 4 :(得分:0)
你查过这篇文章吗?
http://www.codeproject.com/Articles/9715/How-to-Test-Private-and-Protected-methods-in-NET
在你的代码中,我要说你必须首先通过privateObject.GetType()。getMethod(“GetNumber”,flags)获取方法,然后调用它。