使用SubSonic生成的DAL对应用程序进行单元测试

时间:2011-05-13 11:40:52

标签: unit-testing nunit subsonic

我目前正在开发一个继承的代码库。其中一个重要的缺失部分是单元测试。在尝试在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);
}

3 个答案:

答案 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所采取的步骤的总结:

  • 创建新的类库项目。
  • 添加必要的引用 - 我添加了DAL,NUnit和SubSonic。
  • 添加App.config文件 SubSonic知道在哪里找到 SubSonic服务。我为此所做的一切 是把零件拉出来的 与。相关的Web.config 亚音速。
  • 添加测试类并开始向其添加测试。

如果您的测试无法解决,请确保已添加的App.config中的“Copy to Output Directory”设置为“Copy if newer”,请确保App.config中的提供程序名称与使用的提供程序名称相匹配在DAL类中,如果所有其他方法都失败了,请重新启动!