Модульное тестирование приложения с помощью DAL, созданного SubSonic - PullRequest
0 голосов
/ 13 мая 2011

В настоящее время я работаю над унаследованной кодовой базой. Одним из важнейших недостающих элементов является модульное тестирование. Кажется, я наткнулся на контрольно-пропускной пункт при попытке настроить некоторые модульные тесты в NUnit.

Как обычно, я создал отдельный проект модульного тестирования, добавил необходимые ссылки на SubSonic, NUnit и различные библиотеки DLL, созданные приложением, и настроил фиктивный модульный тест, чтобы убедиться, что все настроено правильно. Проблемы начались, когда я попытался сослаться на некоторые объекты, сгенерированные SubSonic. Я создал этот тест для списка пользователей:

[Test]
public void CanListUsers()
{
    UserCollection users = UserController.List(UserController
                                              .Query()
                                              .Where(User.Columns.IsDeleted, false));
    Assert.IsNotNull(users);
}

и получил это исключение:

Не удается найти SubSonicService в вашем Конфигурация приложения

Я исправил это, вытянув части Web.config, которые были связаны с SubSonic, в App.config в проекте модульного тестирования. Теперь, когда я снова запускаю модульные тесты, я получаю:

UnitTests.TestClass.CanListUsers: System.Reflection.TargetInvocationException : Исключение было брошено цель вызова. ----> System.Configuration.ConfigurationErrorsException : Не удалось загрузить тип 'Utility.SqlSubsonicProvider' из сборка 'System.Web, версия = 4.0.0.0, Culture = нейтрально, PublicKeyToken = b03f5f7f11d50a3a.

Это исключение меня смущает, поскольку SqlSubsonicProvider является классом в пространстве имен Utility и его можно увидеть в обозревателе объектов, так почему его ищут в System.Web?

Редактировать: Хорошо, я перестроил пространства имен в решении, чтобы они имели больше смысла. Я думаю, что исправили вышеуказанную ошибку. К сожалению, теперь я получаю эту ошибку:

ChannelMechanics.UnitTests.TestClass.CanListVendors:
System.Reflection.TargetInvocationException : Exception has been thrown by the target 
of an invocation.
  ----> System.NullReferenceException : Object reference not set to an instance of 
        an object.

Что еще более странно, так это то, что модульное тестирование проходит, когда я использую команду Visual Studio «Присоединиться к процессу» в меню «Отладка» и присоединяюсь к графическому интерфейсу NUnit. Моя теория состояла в том, что нулевой объект будет легко обнаружен внутри отладчика.

Если это поможет, мой App.config выглядит так:

<?xml version="1.0" encoding="utf-8" ?>
<configuration>
  <configSections>
    <section name="SubSonicService" 
             type="SubSonic.SubSonicSection, SubSonic"  
             requirePermission="false"/>
  </configSections>
  <connectionStrings>
    <add name="DatabaseConnection" 
         connectionString="*removed*"/>
  </connectionStrings>
  <SubSonicService defaultProvider="TestProvider">
    <providers>
      <clear />
      <add name="TestProvider" 
           type="SubSonic.SqlDataProvider, SubSonic" 
           connectionStringName="DatabaseConnection" 
           generatedNamespace="Test"/>
    </providers>
  </SubSonicService>
</configuration>

Подробности исключения:

at System.RuntimeTypeHandle.CreateInstance(RuntimeType type, 
          Boolean publicOnly, Boolean noCheck, Boolean& canBeCached, 
          RuntimeMethodHandleInternal& ctor, Boolean& bNeedSecurityCheck)
at System.RuntimeType.CreateInstanceSlow(Boolean publicOnly, Boolean skipCheckThis, 
          Boolean fillCache)
at System.RuntimeType.CreateInstanceDefaultCtor(Boolean publicOnly, 
          Boolean skipVisibilityChecks, Boolean skipCheckThis, Boolean fillCache)
at System.Activator.CreateInstance[T]()
at SubSonic.ActiveController`2.Query()
at UnitTests.TestClass.CanListVendors() in UnitTests\TestClass.cs:line 59
--NullReferenceException
at DataAccess.Vendor.GetTableSchema() in DataAccess\Generated\Models\Vendor.cs:line 376
at DataAccess.Vendor.SetSQLProps() in DataAccess\Generated\Models\Vendor.cs:line 42
at DataAccess.Vendor..ctor() in DataAccess\Generated\Models\Vendor.cs:line 35

Тест, который я запускаю, в основном такой же, как приведенный выше, за исключением того, что в списке должны быть поставщики, а не пользователи.

[Test]
public void CanListVendors()
{
    VendorCollection vendors = VendorController.List(
                                        VendorController
                                        .Query()
                                        .Where(Vendor.Columns.IsDeleted, false));
    Assert.IsNotNull(vendors);
}

Ответы [ 3 ]

0 голосов
/ 15 мая 2011

У вас всегда есть SubSonic, а не Subsonic?

Это соответствующий раздел из моего файла конфигурации проектов nunit, который работает ...

  <configSections>
    <section name="SubSonicService" 
             type="SubSonic.SubSonicSection, SubSonic" 
             requirePermission="false"/>
  </configSections>

  <SubSonicService defaultProvider="TAProvider">
    <providers>
      <clear />
      <add name="TAProvider" 
           type="SubSonic.SqlDataProvider, SubSonic" 
           connectionStringName="TATesting" 
           generatedNamespace="DALTA"/>
    </providers>
  </SubSonicService>
0 голосов
/ 19 мая 2011

Кажется, сейчас это работает. Единственное изменение, которое я внес в проект, - это создание отдельного тестового проекта с использованием возможностей модульного тестирования Visual Studio. Единственное другое объяснение, которое я могу придумать, это то, что что-то неприятное было выброшено из памяти, когда я перезагружал компьютер между вчерашним вечером и сегодняшним днем.

В интересах любого, кто в будущем столкнется с этим вопросом, вот краткое изложение шагов, которые я предпринял для тестирования NUnit DAL, сгенерированного SubSonic:

  • Создать новый проект библиотеки классов.
  • Добавьте необходимые ссылки - я добавил DAL, NUnit и SubSonic.
  • Добавьте файл App.config, чтобы SubSonic знает, где найти Сервис SubSonic. Все что я сделал для этого должен был вытащить части в Web.config, которые были связаны с SubSonic.
  • Добавьте тестовый класс и начните добавлять тесты к нему.

Если ваши тесты по непонятным причинам дают сбой, убедитесь, что для параметра «Копировать в выходной каталог» установлено значение «Копировать, если новее» для добавленного файла App.config, убедитесь, что имя поставщика в App.config соответствует имени используемого поставщика. в классах DAL и, если ничего не помогает, перезагрузите компьютер!

0 голосов
/ 13 мая 2011

Я бы предположил, что существует пространство имен System.Web.Utility, и вы получите это неправильное сообщение об ошибке, потому что компилятор "думает", что он должен заглянуть внутрь этого пространства имен для разрешения класса. Пожалуйста, убедитесь, что ваш тестовый проект настроен на целевую платформу "Framework 4", а не "Framework 4 Client Profile".

Отсутствует ".NET Framework 4 Client Profile" в качестве целевой платформы в окне "Новый проект"

...