Лето демонтажа модульных тестов NHibernate

#unit-testing #nhibernate

#модульное тестирование #nhibernate

Вопрос:

Я новичок в NHibernate и модульных тестах. Я пытаюсь следить за видеороликами Summer of NHibernate. Я могу успешно запускать модульные тесты для своего объекта-участника (в видеороликах используется объект customer, я использовал member), когда ни в каких дочерних таблицах нет связанных данных. Однако, когда в любой из дочерних таблиц есть какие-либо связанные записи, модульные тесты завершаются неудачей со следующим исключением: (Пока не спешите с выводами)

 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: SOFTWARE2SQL2008E
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 выполняется, метод демонтажа выдает исключение.

Кто-нибудь сталкивался с такими же похожими проблемами при просмотре видео? Есть ли лучший способ выполнить модульное тестирование с базой данных / NHibernate?

РЕДАКТИРОВАТЬ: Насколько я понимаю, цель метода демонтажа — отменить операции с базой данных, которые были выполнены во время модульного тестирования.

Спасибо, Эрик

Дополнительная информация: Методы настройки тестового устройства.

 <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:

Оказывается, что не все мои связанные таблицы базы данных, отображенные как объекты, вызывали проблемы с внешним ключом.