Как я могу наследовать внутренний класс, используя абстрактный базовый класс? - PullRequest
2 голосов
/ 02 июля 2010

Я пытаюсь создать тестовый класс, который организует свои тестовые методы, используя внутренние классы.Я хотел бы, чтобы этот класс был абстрактным со способностью устанавливать статическое свойство, чтобы это свойство могло быть введено.Вот пример того, о чем я говорю:

[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 ]

3 голосов
/ 02 июля 2010

В языке C # вложенные классы не имеют особых отношений с классом, в который они вложены.Это совершенно другой тип.Есть только одна веская причина, по которой вы могли бы сделать это: вы можете объявить класс закрытым.Это помогает вам создать небольшой рабочий класс для выполнения работы от имени внешнего класса, класса, который полностью невидим извне.Очень полезно, вы не можете иначе объявить закрытый класс в области видимости внешнего класса, лучшее, что вы можете сделать, это внутренний.

Из этого следует, что он никоим образом не играет роли в наследовании внешнего класса.Класс, производный от внешнего, вообще не имеет видимости для вложенного класса внутри базового класса.Как и было задумано, объявление его частным было причиной его вложения.

Punt: если вам нужен этот класс в производном, просто объявите его внутренним или общедоступным.

2 голосов
/ 02 июля 2010

Вложенные типы не работают таким образом. Вы не можете "переопределить" типы.

Не ясно, чего вы пытаетесь достичь здесь, но я не думаю, что это сработает.

1 голос
/ 04 июля 2010

С помощью xUnit.NET и SubSpec вы можете выполнить расширенную переписывание тестов в стиле BDD. SubSpec включен в загружаемые файлы xUnit.NET в эти дни. Подробнее о тестировании SubSpec и BDD вы можете прочитать в следующей статье:

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

0 голосов
/ 02 июля 2010

Как насчет использования файла конфигурации? Например

   [TestClass]
   public class WhenFoo
   {
      [TestMethod]
      public void TestFoo()
      {
         string str = ConfigurationManager.AppSettings["WhenFooTestFooString"];
      }
   }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...