我目前正在开发一个继承的代码库。其中一个重要的缺失部分是单元测试。在尝试在NUnit中设置一些单元测试时,我似乎遇到了障碍。
我正常创建了一个单独的单元测试项目,添加了对SubSonic,NUnit和应用程序创建的各种DLL的必要引用,并设置了一个虚拟单元测试,以确保一切设置正确。当我试图引用SubSonic生成的一些对象时,问题就出现了。我创建了此测试以列出用户:
[Test]
public void CanListUsers()
{
UserCollection users = UserController.List(UserController
.Query()
.Where(User.Columns.IsDeleted, false));
Assert.IsNotNull(users);
}
并得到了这个例外:
找不到你的SubSonicService 应用程序的配置
我通过将与SubSonic相关的Web.config部分拉出到单元测试项目中的App.config中来解决这个问题。现在,当我重新运行单元测试时,我得到:
UnitTests.TestClass.CanListUsers: System.Reflection.TargetInvocationException :例外已被抛出 调用的目标。 ----> System.Configuration.ConfigurationErrorsException :无法加载类型 'Utility.SqlSubsonicProvider'来自 assembly'System.Web,Version = 4.0.0.0, 文化=中性, 公钥= b03f5f7f11d50a3a”。
这个异常让我感到困惑,因为SqlSubsonicProvider是Utility命名空间中的一个类,可以在Object Browser中看到,为什么要在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.
更奇怪的是,当我在Debug菜单中使用Visual Studio的“Attach to Process”命令并附加到NUnit GUI时,单元测试通过了。我的理论是,在调试器中很容易发现null对象。
如果有帮助,我的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);
}
答案 0 :(得分:0)
我建议有一个System.Web.Utility
命名空间,你得到这个错误的错误消息,因为编译器“认为”他必须查看这个命名空间来解析这个类。
请检查您的测试项目是否设置为目标框架“Framework 4”而不是“Framework 4 Client Profile”。
Missing ".NET Framework 4 Client Profile" as target framework in "New Project" window
答案 1 :(得分:0)
您是否总是使用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>
答案 2 :(得分:0)
这似乎现在正在发挥作用。我在项目中唯一的变化是使用Visual Studio的单元测试功能创建一个单独的测试项目。我能想到的唯一其他解释是,昨天晚上和今天之间我重新启动电脑时,有些麻烦的东西被丢了。
为了将来绊倒这个问题的任何人的利益,这里是我为使NUnit测试由SubSonic生成的DAL所采取的步骤的总结:
如果您的测试无法解决,请确保已添加的App.config中的“Copy to Output Directory”设置为“Copy if newer”,请确保App.config中的提供程序名称与使用的提供程序名称相匹配在DAL类中,如果所有其他方法都失败了,请重新启动!