【问题标题】:Accessing internal class through reflection通过反射访问内部类
【发布时间】:2012-09-07 10:27:06
【问题描述】:

目前我想做一个需要 100% 功能覆盖的 UT 覆盖。 我的应用程序中有一个名为 FunctionParser.cs 的公共类,它在内部使用第三方提供的名为 Autocomplete 的内部类。现在的问题是 AutoComplete 类中几乎没有未经测试的功能。因此,为了覆盖这个名为“AutoComplete”的内部类,我尝试使用反射,但对我没有任何作用,有人可以告诉我如何使用反射来访问这个内部类以进行测试。

注意:除了使用 •Get [InternalsVisibleTo] 之外,我无法修改 AutoComplete.CS,它是第 3 方提供的内部类。请建议任何其他可以在不修改第三方类的情况下工作

【问题讨论】:

  • 您应该能够在内部使用反射。向我们展示您已经尝试过的内容。
  • 你是什么意思“没有工作”。这就像去看医生,只是说“我感觉不舒服”!

标签: c# .net reflection internal


【解决方案1】:
var innerType = Assembly.GetExecutingAssembly().GetTypes()
                .Where(t => t.DeclaringType == typeof(Outer))
                .First(t => t.Name == "Inner");

var innerObject = Activator.CreateInstance(innerType);
innerType.GetMethod("InnerTest", BindingFlags.Instance | BindingFlags.NonPublic)
         .Invoke(innerObject, new object[] { });

--

public class Outer
{
    class Inner
    {
        internal void InnerTest()
        {
            Console.WriteLine("test");
        }
    }
}

【讨论】:

  • 您好,首先感谢大家的回复。答案 1:我想提一下,它不是“第三方代码”,它基本上是我们自己的代码,但我们不想对其进行任何修改,这就是我将其称为 3rd 方的原因。答案 2:不是我的构造函数是内部的,我的类本身是内部的,即在类声明本身中它标记为内部。
  • 很抱歉,我刚刚观察到 InnerTest 不是构造函数,将对其进行测试并返回
  • @Divya 如果它对您有用,请参阅How does accepting an answer work?
【解决方案2】:

您不应该对第三方提供的代码进行单元测试。如果您的代码依赖于外部代码,则模拟该代码的行为。例如,外部库可能需要封装在实现特殊接口的附加类中。比将该接口注入到您的代码中,例如在构造函数中。在单元测试中,您将注入模拟实现。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2010-11-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-01-11
    • 2010-09-11
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多