【问题标题】:Unit Testing an Application with a DAL Generated by SubSonic使用 SubSonic 生成的 DAL 对应用程序进行单元测试
【发布时间】:2011-05-13 11:40:52
【问题描述】:

我目前正在处理继承的代码库。缺少的关键部分之一是单元测试。在尝试在 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' 来自 程序集'System.Web,版本= 4.0.0.0, 文化=中性, 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 GUI 时,单元测试通过了。我的理论是从调试器中很容易发现空对象。

如果有帮助,我的 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);
}

【问题讨论】:

    标签: unit-testing nunit subsonic


    【解决方案1】:

    我建议有一个System.Web.Utility 命名空间,你会收到这个错误的错误消息,因为编译器“认为”他必须查看这个命名空间来解析类。 请检查您的测试项目是否设置为目标框架“框架 4”而不是“框架 4 客户端配置文件”。

    Missing ".NET Framework 4 Client Profile" as target framework in "New Project" window

    【讨论】:

    • 是的,我认为这个项目中的命名空间一定有些奇怪。我已经使用 Microsoft Northwind 创建了一个测试项目,并且能够按预期连接到它。我想这是处理别人代码的乐趣之一——在意想不到的地方出现意想不到的错误!
    【解决方案2】:

    这似乎正在工作。我在项目中所做的唯一更改是使用 Visual Studio 的单元测试功能创建一个单独的测试项目。我能想到的唯一其他解释是昨天晚上和今天之间我重新启动计算机时出现了一些麻烦的内存。

    为了方便以后遇到这个问题的人,这里总结了我为让 NUnit 测试由 SubSonic 生成的 DAL 所采取的步骤:

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

    如果您的测试莫名其妙地失败,请确保添加的 App.config 的“复制到输出目录”设置为“如果更新则复制”,确保 App.config 中的提供程序名称与使用的提供程序名称匹配在 DAL 类中,如果所有其他方法都失败,请重新启动!

    【讨论】:

      【解决方案3】:

      你总是有亚音速而不是亚音速吗?

      这是我的 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>
      

      【讨论】:

      • 谢谢迈克,这实际上是我检查的第一件事,整个项目的名字肯定是 SubSonic。有时答案就是这么简单,可惜这次不是!
      猜你喜欢
      • 1970-01-01
      • 2012-03-21
      • 2011-03-25
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-01-01
      • 2016-04-05
      • 1970-01-01
      相关资源
      最近更新 更多