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

时间:2013-05-29 13:36:30

标签: c# visual-studio-2010 unit-testing

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

以下代码一直给我以下例外:

  

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

请帮助:)

5 个答案:

答案 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)获取方法,然后调用它。