NHibernate单位的夏天测试拆解

时间:2011-05-03 21:45:00

标签: unit-testing nhibernate

我是NHibernate和单元测试的新手。我试图关注NHibernate的夏天视频。当任何子表中没有相关数据时,我能够成功地对我的会员(视频使用客户对象,我使用成员)对象运行单元测试。但是,当任何子表中存在任何相关记录时,单元测试将失败,并出现以下异常:(不要跳到结论)

Setup.CanGetMemberByFirstName.TearDown 

Failures

Exception
System.Data.SqlClient.SqlException: The DELETE statement conflicted with the 
REFERENCE
constraint "FK_tblTransaction_tblMembers". The conflict occurred in database "TempPP2",
table "dbo.tblTransaction", column 'MemberID'.
The statement has been terminated.
Errors: System.Data.SqlClient.SqlErrorCollection
Class: 16
LineNumber: 1
Number: 547
Procedure: 
Server: SOFTWARE2\SQL2008E
State: 0
ErrorCode: -2146232060
TargetSite: Void PerformDbOperation(NDbUnit.Core.DbOperationFlag)
HelpLink: null
   at NDbUnit.Core.NDbUnitTest.PerformDbOperation(DbOperationFlag dbOperationFlag)
   at Microdesk.Utility.UnitTest.DatabaseUnitTestBase.LoadDatabase(String connectionString, String schemaFilePathName, String datasetFilePathName, DatabaseClientType clientType)
   at Microdesk.Utility.UnitTest.DatabaseUnitTestBase.LoadTestDatabase()
   at Microdesk.Utility.UnitTest.DatabaseUnitTestBase.DatabaseSetUp()
   at PPDataTest.UnitTest.Setup()

现在异常非常明显。似乎正在删除在tblTransaction表中具有子记录的成员。但是,被调用的方法(CanGetMemberByFirstName)仅运行select语句。

<Test()> _    
Public Sub CanGetMemberByFirstName()
    Const MEMBER_FIRSTNAME As String = "ERIC"
    Dim members As IList(Of Member) = _provider.GetMembersByFirstName(MEMBER_FIRSTNAME)
    For Each m As Member In members
        Assert.AreEqual(MEMBER_FIRSTNAME, m.FirstName)
    Next
End Sub

拆解方法可能是删除语句发生的地方,但我不知道如何解决此问题。总而言之,即使没有我正在查询的成员对象的记录,当tblTransactions表中存在相关记录时,所有测试都会失败。它也没有区别正在执行哪个CRUD操作,TearDown方法抛出异常。

在关注视频时,有没有人遇到过类似的问题?有没有更好的方法对数据库/ NHibernate执行单元测试?

修改 据我所知,TearDown方法的目的是撤消在单元测试期间执行的数据库操作。

谢谢, 埃里克

更多信息: 测试夹具设置方法。

<TestFixtureSetUp()> _
Public Sub TestFixtureSetup()
    _provider = New PPData.DataProvider
    DatabaseFixtureSetUp()
End Sub

<TestFixtureTearDown()> _
Public Sub TestFixtureTearDown()
    DatabaseFixtureTearDown()
End Sub

<SetUp()> _
Public Sub Setup()
    DatabaseSetUp()
End Sub

<TearDown()> _
Public Sub TearDown()
    DatabaseTearDown()
End Sub

Private Sub GetMyTestDataXMLFile()
    SaveTestDatabase()
End Sub

1 个答案:

答案 0 :(得分:0)

事实证明,没有将所有相关数据库表映射为对象导致外键问题。