代码之家  ›  专栏  ›  技术社区  ›  LandonSchropp

如何使用抽象基类继承内部类?

  •  2
  • LandonSchropp  · 技术社区  · 15 年前

    我试图创建一个测试类,它使用内部类来组织它的测试方法。我希望这个类是抽象的,能够设置一个静态属性,以便可以注入这个属性。下面是我所说的一个例子:

    [TestClass]
    public abstract class BaseUnitTest
    {
       public static string InjectedProperty;
    
       public static string GetInjectedString()
       {
          return InjectedProperty;
       }
    
       [TestClass]
       public class WhenFoo
       {
          [TestMethod]
          public void TestFoo()
          {
             string str = GetInjectedString();
          }
       }
    }
    
    [TestClass]
    public class DeriverdUnitTest : BaseUnitTest
    {
       [ClassInitialize]
       public void SetUp()
       {
          InjectedProperty = "Injected Property";
       }
    }
    

    但是,在我的单元测试视图中看不到一个derivedUnitTest+whenFoo+testfoo()类。我正在使用Visual Studio 2010。我猜当我重写baseUnitTest时,也不会重写它的内部类。我想我可以将它的内部类抽象化,稍后重写它们,但是随着我的测试类的复杂性的增加,这将变得非常烦人。有人能解释一下为什么会发生这种情况吗?我该如何解决?

    谢谢。

    编辑:

    我觉得我需要更好地解释我想这样做的原因。我们想实现一个测试标准,它的命名非常冗长。因此,一个测试类应该如下所示:

    [TestClass]
    public abstract class BaseUnitTest
    {
       public static string InjectedProperty;
    
       public static string GetInjectedString()
       {
          return InjectedProperty;
       }
    
       [TestClass]
       public class WhenFooIsCalled
       {
          [TestClass]
          public class AndTheArgumentIsNull
          {
             [TestMethod]
             public void AnArgumentNullExceptionShouldBeThrown()
             {
                string str = GetInjectedString();
             }
          }
       }
    }
    

    这样做的好处是,当您在Visual Studio中打开测试视图并显示方法名和类名列时,您得到的结果如下:

    BaseUnitTest+WhenFooIsCalled+AndTheArgumentIsNull AnArgumentNullExceptionShouldBeThrown()
    

    这使得我们更容易一目了然地分辨出几百个通过测试中失败的测试应该做什么。

    我希望能够重写抽象的BaseUnitTest的主要原因是,当我执行BaseUnitTest中包含的所有测试时,这些测试都将添加到DerivedUnitTest中,并显示在Visual Studio的测试视图中。

    再次感谢。

    4 回复  |  直到 14 年前
        1
  •  2
  •   Jon Skeet    15 年前

    嵌套类型不能这样工作。不能“重写”类型。

    现在还不清楚你想在这里实现什么,但我不认为这会奏效。

        2
  •  3
  •   Hans Passant    15 年前

    在C语言中,嵌套类与嵌套类的类没有特殊关系。它是完全不同的类型。只有一个很好的理由可以这样做:您可以声明类是私有的。这有助于您创建一个小型工人类,以代表外部类完成工作,外部类是完全不可见的类。非常有用,您不能在外部类范围内声明私有类,您所能做的最好的是内部的。

    接下来的是,它绝不会在外部阶级的继承中起作用。从外部派生的类对基类内的嵌套类完全不可见。这就是它的意图,宣称它是私有的,这是把它筑巢在第一位的原因。

    punt:如果在派生类中需要这个类,只需声明它是内部的或公共的。

        3
  •  1
  •   jrista    15 年前

    您可以使用xunit.net和subspec完成丰富、冗长、BDD风格的测试重印。这些天,Xunit.net附加软件下载中包含了subspec。您可以在以下文章中阅读有关subspec和bdd测试的更多信息:

    http://haacked.com/archive/2008/08/24/introducing-subspec.aspx

        4
  •  0
  •   s_hewitt    15 年前

    使用配置文件怎么样?例如

       [TestClass]
       public class WhenFoo
       {
          [TestMethod]
          public void TestFoo()
          {
             string str = ConfigurationManager.AppSettings["WhenFooTestFooString"];
          }
       }
    
    推荐文章