В настоящее время я работаю над унаследованной кодовой базой. Одним из важнейших недостающих элементов является модульное тестирование. Кажется, я наткнулся на контрольно-пропускной пункт при попытке настроить некоторые модульные тесты в 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);
}