代码之家  ›  专栏  ›  技术社区  ›  Brian Mains

带有数据库和ADO.NET实体框架的.NET TDD-集成测试

  •  3
  • Brian Mains  · 技术社区  · 14 年前

    我使用的是ADO.NET实体框架,使用的是连接到本地数据库服务器的AdventureWorks数据库。对于单元测试,人们采用了哪些方法来处理数据库?

    有什么建议吗?

    谢谢。

    5 回复  |  直到 14 年前
        1
  •  2
  •   Community CDub    4 年前

    我也经历过类似的情况。

    将数据存储到DB并将其保留到以前的状态,这并不是理想的单元测试。它们是集成测试用例。

    1.使用不同的数据库(更改实际数据库的名称),使模式与实际数据库保持相同。

    2.将单元测试指向新创建的DB。

    答:在批处理文件中列出SQL脚本,如下面所示(这里我假定您使用的是SQL SERVER)

    例如,sqlcmd-ic:\data\runscripts\InventoryMonthEnd.sql

    指定批处理文件,该文件存放要在MSBuild进程中执行的此sql语句。

    <ItemGroup>
    <StoredProcScripts Include="$(RelativeSPDir)/*.sql" />
    </ItemGroup>
    
    <Target>
    <Exec Command="isql -E -n -b -d DBName -i %(StoredProcScripts.Identity)" Condition="'%(StoredProcScripts.Identity)' != ''"/>
    </Target>
    
        2
  •  1
  •   Eric J.    14 年前

    就我个人而言,我让每个测试创建自己的数据,并在测试完成时删除它。这样,测试所需的数据和测试本身紧密地保持在一起,可以作为一个单元来维护。对于一组相关测试共享的数据(在同一个*Test.cs文件中),我使用 [TestInitialize] Start() [TestCleanup] Finish() .

    我还有一个实用程序,可以重新创建一个空的测试数据库,因为如果我调试测试并在调试器中终止它,单元测试的清理代码将不会运行。为了重新创建数据库,我使用ef4的ObjectContext.CreateDatabase()方法。

        4
  •  0
  •   Numan    14 年前

    我们就是这样解决的:

    1. 删除测试通过/失败后创建的所有测试数据。有点像 try...finally
        5
  •  0
  •   brumScouse    7 年前

    在C#如果你使用一个事务处理范围,而不进行事务处理,你有一个非常有效的方法来保持事情的整洁。