6

我有这个:

 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();
   }

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

正如我在这里发现的,一种选择是使用所有子方法提取类。但为什么我需要这样做。它仅用于FooGenerator.

你有什么建议我怎样才能让我的课更容易测试?

4

3 回答 3

2

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

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();
        }
   }
}

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

于 2013-04-10T08:29:02.943 回答
1

客户是谁?

许多人(Roy OsheroveMichael Feathers)认为测试客户端与接口或服务客户端一样有效。

考虑到这一点,我认为通过公开一些私有方法来打开可测试的接缝来稍微违反封装原则是可以的。

于 2013-04-10T08:20:59.523 回答
0

你的类不是一件事而是几件事——每件事都封装在一个私有方法中。这违反了单一职责原则 (SRP)。根据 SRP,一个类应该只做一件事。

Neil Thompson 建议您应该公开私有方法。这至少使它们可以被单元测试访问,但它们仍然违反 SRP。如果您的班级有很多不同的事情,那么启动通常很复杂;您必须在满足所有方法需求的状态下创建类,尽管您只想测试一个小角落。这对可测试性没有任何好处。

在此之后,outcoldman 的答案是更合理的设计。他的代码没有违反 SRP。

于 2013-04-10T10:41:38.143 回答