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

本文关键字:失败 测试 有方法 方法 | 更新日期: 2023-09-27 18:15:58

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

下面的代码一直给我以下异常:

系统。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中使用"创建私有访问器"按钮,但是它只创建一个测试引用文件,而不是一个实际的影子类…所以这行不通。

请帮忙:)

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

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

public abstract class MyClassBase {
   private void DoThis(){}
   protected void DoThat(){}
}
public class MyImplemntation : MyClassBase {
  //I don't know DoThis();
  //I know DoThat();
}

要通过反射调用私有方法,您需要指定几个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定义成员不是public。

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

看,我不是很确定,如果你试图调用一个私有成员和单元测试,但请记住,这是错误的方法。

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

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

这可能会让你剩下的路就像那里一样。
使用c#动态类型方便地访问对象内部。

你看过这篇文章了吗?

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

在你的代码中,我说你必须首先通过privateObject.GetType(). getmethod("GetNumber",标志)获得方法,然后调用它。