#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:
Оказывается, что не все мои связанные таблицы базы данных, отображенные как объекты, вызывали проблемы с внешним ключом.