c# - 如何让类更具可测性?

标签 c# .net oop unit-testing encapsulation

我有这个:

 class FooGenerator:IFooGenerator {
      private object _generated;

      public void Generate() {
         // Generating
         GenerateSmallPart();
         GenerateOtherSmallPart();
         GenerateTinyPart();
         // A lot similar
      }

      private void GenerateSmallPart() {
         //add small part to _generated
      }

      private void GenerateOtherSmallPart() {
         //add small part to _generated
      }

      private void GenerateTinyPart() {
         //add small part to _generated
      }
   }

   internal interface IFooGenerator {
      void Generate();
   }

在我的应用程序中,我仅通过 IoC 使用 IFooGenerator,但我想测试所有这些子方法。

我发现 here ,一种选择是使用所有子方法提取类。但是为什么我需要那样做。它仅在 FooGenerator 中使用。

您有什么建议可以让我的类(class)更易于测试吗?

最佳答案

我将与您分享我通常如何处理这种情况。如果我发现我出于某种原因想要测试一些私有(private)方法(比如很难 stub 输入参数来测试所有代码流)——这对我来说通常意味着我的类的复杂性很高,我需要重构我的代码。在你的情况下(我不知道你的方法在做什么)你可以使用类似的东西:

interface IPartGenerator
{
   void GeneratePart();
}

class SmallPartGenerator : IPartGenerator
{
   void GeneratePart();
}

class OtherSmallPartGenerator : IPartGenerator
{
   void GeneratePart();
}

class TinyPartGenerator : IPartGenerator
{
   void GeneratePart();
}

class FooGenerator:IFooGenerator 
{
   private IPartGenerator[] partGenerators = new IPartGenerator[] 
                        {
                           new SmallPartGenerator(), 
                           new OtherSmallPartGenerator(), 
                           new TinyPartGenerator ()
                        }

   public void Generate()
   {
        foreach (var partGenerator in partGenerators)
        {
              partGenerator.GeneratePart();
        }
   }
}

现在您可以分别测试每个零件生成器。

关于c# - 如何让类更具可测性?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15920253/

相关文章:

.net - DocFx:如何在网站上创建目录导航?

java - 如何向类型层次结构中的类添加缺失的方法以允许统一处理?

c# - 一个对象应该将自己写到一个文件中,还是应该由另一个对象作用于它来执行 I/O?

c# - Decimal.Parse 抛出 FormatException

c# - ASP.Net MVC 替代登录身份

c# - WPF 中 ContextMenu 中的 CommandParameters

ruby - 使用 ruby​​ 中的类方法跨对象共享数据库连接?

c# - 在 gridview 中单击删除按钮/链接时创建警报时出错

c# - int 列表的内存大小

c# - TcpClient 未正确接收数据