Почему модульные тесты базы данных VS с использованием TransactionScope и MSDTC терпят неудачу? - PullRequest
2 голосов
/ 13 мая 2009

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

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

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

System.Transactions.TransactionException: транзакция уже была явно или явно зафиксирована или прервана.

Настройки MSDTC точно такие же, как и у работающего, мы сравнивали экран за экраном.

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

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

Ответы [ 2 ]

3 голосов
/ 25 июня 2009

Похоже, это связано с 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);

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

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

1 голос
/ 18 мая 2009

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

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

Привет

MAC

...