【问题标题】:How do I unit test a class that has private methods and fields using xUnit?如何使用 xUnit 对具有私有方法和字段的类进行单元测试?
【发布时间】:2018-02-01 06:00:04
【问题描述】:

我正在尝试使用私有访问修饰符对类方法进行单元测试,但无法修改这些方法的可访问性。

public class Form1 : Form
{
    private void MyMethod(object sender, EventArgs e)
    {
        // business code
    }

    private void InitializeComponent()
    {
        this.Load += new System.EventHandler(this.MyMethod);
    }
}

【问题讨论】:

  • 你不会从单元测试中测试它们。您将通过测试公共方法和属性来测试它们。
  • @Fabio 我没有公共方法,我只有私有方法,它们有我需要在其上运行测试的业务逻辑。
  • 它是如何工作的?如果您的类没有公共接口,那么该逻辑如何执行?
  • 它绝对有一个公共接口,但只是一个方法调用。像这样:this.Load += new System.EventHandler(this.MyMethod); 和 MyMehod() 是私有的。 @dymanoid
  • 请向您的课程或示例展示您将如何在应用程序中使用它。当您编写测试时,您将编写将使用您的测试类的代码。所以为了回答你的问题,我们需要看看你将如何使用它

标签: c# unit-testing tdd xunit


【解决方案1】:
  1. 不要将业务代码放入表示/UI 层
  2. 如果您的 UI 层中仍有值得测试的代码,请使用 Model/View/Presenter 或 Model/View/Controller 甚至 Humble View 将该代码与实际的 UI 类分开,并以这种方式使它们可测试.

注意:你的类确实有公共方法。它们隐藏在其父类中。

【讨论】:

    【解决方案2】:

    您可以制作临时的内部测试方法:

    internal void MyMethodForTest(object sender, EventArgs e) //test method
    {
        //business code
    }
    
    private void MyMethod(object sender, EventArgs e) //real method
    {
        //business code
    }
    

    然后,添加这一行,以便测试可以访问您的内部方法:

    [assembly:InternalsVisibleTo("UnitTest")]
    

    完成测试后,您可以删除内部测试方法。

    【讨论】:

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