2009-05-13 4 views
2

У нас есть некоторые модульные тесты, выполняемые с базой данных SQL Server 2000, с использованием класса DatabaseTestFixture, который использует TransactionScope, который не выполняется, и поэтому все изменения откатываются назад. Тестирование проходило против локальной базы данных без проблем.Почему тесты базы данных VS с использованием TransactionScope и MSDTC терпят неудачу?

Затем мы указали единичные тесты на общем сервере базы данных и установили MSDTC на машине, на которой выполняются модульные тесты, и все хорошо с этой машиной.

Теперь, хотя мы установили новую машину, которая будет запускать модульный тест, также против одной и той же общей базы данных. Испытательная установка не работает на этой машине, мы получим следующее сообщение об ошибке:

System.Transactions.TransactionException : The transaction has already been implicitly or explicitly committed or aborted.

В MSDTC настройки точно такие же, как и тот, который работает, мы сравнили экран на экране.

Кто-нибудь испытал что-то подобное раньше? Или есть какие-то указатели на то, где мы можем искать подсказки относительно того, что может вызвать это?

Мы проверили версии Windows и пакеты обновления, параметры брандмауэра, параметры msdtc, версии VS и пакеты обновления.

ответ

3

Это, кажется, связано с NUnit 2.5. Перед этим, следующий код работал отлично:

[SetUp] 
public void SetUp() { 
    this._testDataContext = new DataContext(); 
    this._transactionScope = new TransactionScope(); 
} 

[TearDown] 
public void TearDown() { 
    if (_transactionScope != null) 
    { 
     this._transactionScope.Dispose(); 
    } 
    if (_testDataContext != null) 
    { 
     _testDataContext.Dispose(); 
    } 
} 

С 2.5 объем транзакций должен инстанциирован с TransactionScopeOption.RequiresNew. Я предполагаю, что либо он не находится правильно, либо что NUnit имеет некоторые внешние транзакции, выполняемые при запуске тестов. Измените вторую строчку по методу SetUp в

this._transactionScope = new TransactionScope(TransactionScopeOption.RequiresNew); 

и он должен работать правильно.

Если кому-то удастся лучше объяснить, почему это происходит, я бы хотел его услышать.

+0

спасибо, что у меня была точно такая же проблема, и я не мог понять, что с ней не так. это простое исправление, исправлено для меня. – Somedeveloper

1

Эта проблема, вероятно, связана с версией Nunit, которую вы используете. У меня была такая же проблема при запуске модуля 2.5, но проблема таинственно исчезает, когда я запускаю модульные тесты с помощью nunit 2.4.8 или 2.2.

Пожалуйста, попробуйте это, сообщите мне, чтобы я увеличил свои штрафные очки!

С уважением

MAC

+0

В настоящее время я использую nunit 2.2.8 - могу попробовать переустановить, чтобы узнать, помогает ли это. Если это так, я дам вам очки! :-) – jryan

+0

Я только что проверил, и это действительно так. У меня есть несколько тестов, которые работают с 2.4.8-net-2.0, но при переходе к ошибке 2.5.0-net-2.0 с транзакцией прерывается. –

Смежные вопросы