2011-05-03 59 views
0

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

拆卸方法可能是delete语句发生的地方,但我不知道如何解决这个问题。总而言之,即使没有我正在查询的成员对象的记录,当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 

回答

0

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