1

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

下面的代码不断给我以下异常:

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 中使用“创建私有访问器”按钮,但是它只创建了一个测试参考文件,而不是一个实际的影子类......所以这不起作用。

请帮忙 :)

4

5 回答 5

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定义该成员不是静态的。

于 2013-05-29T13:50:01.317 回答
2

如果来自抽象“基”类的方法必须可以通过从抽象类继承的类型来访问,则它们应该(至少)标记为protected,而不是private

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

public class MyImplemntation : MyClassBase {

  //I don't know DoThis();
  //I know DoThat();
}
于 2013-05-29T13:42:10.407 回答
1

看,我不确定如果您尝试调用私有成员并对其进行单元测试,但请记住这是错误的方法。

您应该测试您的公共方法并观察响应、沟通和行为。私有方法只是一个实现细节。

于 2013-05-29T13:45:02.403 回答
0

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

这可能会让你在那儿走完剩下的路。
使用 C# 动态类型来方便地访问对象的内部。

于 2013-05-29T13:50:15.723 回答
0

你检查过这篇文章吗?

http://www.codeproject.com/Articles/9715/How-to-Test-Private-and-Protected-methods-in-NET

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

于 2013-05-29T13:50:30.970 回答