C# 如何在参数数量相等时使用 System.Reflection 调用私有(private)重载方法

标签 c# reflection mstest

我有一个名为 TicketManager 的类。此类有两个私有(private)方法 private void Validate(Ticket ticket) 和一个重载方法 private void Validate(TicketResponse ticketResponse)

当我在未指定 Type[] 的情况下使用 BindingFlags 时,我得到了一个不明确的匹配异常。

以下代码是我使用 MSTest 进行的单元测试。

//testing private validation method using reflection
    [TestMethod]
    [ExpectedException(typeof(TargetInvocationException))]
    public void Validate_TicketResponseIsInvalid_ReturnsValidationException()
    {
        //Arrange
        TicketManager ticketManager = new TicketManager(ticketRepository);
        Ticket t = new Ticket { AccountId = 1, Text = "How do I test a private method in C#?", TicketNumber = 5 };
        TicketResponse tr = new TicketResponse { Ticket = t, IsClientResponse = false, Date = DateTime.Now };

        //reflection
        MethodInfo methodInfo = typeof(TicketManager).GetMethod("Validate", new Type[] { typeof(TicketResponse) });
        object[] parameters = {tr};
        //Act
        methodInfo.Invoke(ticketManager, parameters); //throws NullReferenceException

        //Assert
        //assertion happens using attribute added to method
    }

最佳答案

您需要使用允许您指定 BindingFlags 的重载,以指定 NonPublic。例如:

    MethodInfo methodInfo = typeof(TicketManager).GetMethod("Validate",
        BindingFlags.NonPublic | BindingFlags.Instance,
        null, new Type[] { typeof(TicketResponse) }, null);

但是,在测试的上下文中,我想知道这是否实际上应该有一个公共(public) API,或者至少有一个 internal API(而不是 private)并且使用 [InternalsVisibleTo(...)] 让您的测试套件访问它。

关于C# 如何在参数数量相等时使用 System.Reflection 调用私有(private)重载方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51631254/

相关文章:

c# - TextReader.Peek 行为和检测流/阅读器的结尾

c# - System.Reflection.Assembly.GetExecutingAssembly() 总是返回 0.0.0.0

visual-studio-2017 - 在 Visual Studio 2017 15.8.1 中使用 MSTest v1 运行测试的指南

c# - 需要验证数据契约(Contract)和数据成员

c# - 有没有更简单的方法来访问 Jarray 中的 Json 对象值

c# - 使用 CaSTLe 动态代理 - 可以控制和/或删除拦截器

c# - MS 测试断言检查

jenkins - jenkins 中的 VStest 代码覆盖率报告

c# - Directory.GetCurrentDirectory() 不返回正确的目录

c# - 为什么我不能使用反射加载 AssemblyVersion 属性?