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

时间:2010-07-01 20:50:21

标签: c# unit-testing class testing abstract

我正在尝试创建一个使用内部类组织其测试方法的测试类。我希望这个类是抽象的,能够设置静态属性,因此可以注入此属性。这是我正在谈论的一个例子:

[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 个答案:

答案 0 :(得分:3)

在C#语言中,嵌套类与它们嵌套的类没有特殊关系。这是一种完全不同的类型。你做过这个的原因只有一个:你可以将这个类声明为私有。这有助于您创建一个小工作类来代表外部类完成工作,这是一个从外部完全不可见的类。非常有用,你不能在外类范围内声明私有类,你可以做的最好是内部。

以下是它绝不会在外部类的继承中发挥作用。从外部派生的类根本不能看到基类中的嵌套类。这是意图,宣称它是私有的是首先将它嵌套的原因。

Punt:如果您在派生的类中需要该类,只需将其声明为内部或公共。

答案 1 :(得分:2)

嵌套类型无法正常工作。你不能“覆盖”类型。

目前尚不清楚你在这里想要达到的目标,但我认为它无法发挥作用。

答案 2 :(得分:1)

您可以使用xUnit.NET和SubSpec完成丰富,冗长,BDD风格的测试重写。 SubSpec现在包含在xUnit.NET附加组件下载中。您可以在以下文章中阅读有关SubSpec和BDD测试的更多信息:

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

答案 3 :(得分:0)

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

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