В тестах Nested TransactionScope произошел сбой

Я использую MSTest для запуска некоторых автоматических тестов для БД MySQL 5.5.19 через MySQL Connector и с использованием EntityFramework 4.3.

Я пытаюсь использовать TransactionScopeв моей БД-доступ к библиотеке классов для выполнения отката при необходимости. Кроме того, в моем тестовом коде я хочу использовать TransactionScope, чтобы возвращать БД в известное состояние перед каждым тестом. Для этого я использую методы TestInitializeи TestCleanup. Они выглядят так:

[TestInitialize()]
public void MyTestInitialize()
{
   testTransScope = new TransactionScope(TransactionScopeOption.RequiresNew);
}

[TestCleanup()]
public void MyTestCleanup()
{
   Transaction.Current.Rollback();
   testTransScope.Dispose();
}

Основываясь на конструкции объекта TransactionScopeв функции инициализации, я полагаю, что должен получить новую область транзакции, (не существует «окружающей» области, поэтому я считаю, что это «.RequiresNew» здесь технически не важен, поскольку «.Required» даст тот же результат. Поскольку я не указываю значение тайм-аута, он предоставляет мне тайм-аут по умолчанию, который, как я понимаю, составляет 60 секунд. Много времени для моего данного теста, чтобы запустить.

У меня есть функция с именем AddDessert(DessertBiz dessertBizObject), которая отчасти выглядит примерно так:

using (var transScope = new TransactionScope(TransactionScopeOption.Required))
{
   try
   {
      //...
      context.Desserts.Add(dessert);
      context.SaveChanges();
      var dessertId = dessert.Id;
      DoOtherDessertStuff(dessertId, dessertBizObject);
      transScope.Complete();
   }
   catch (InvalidOperationException ex)
   {
      Console.WriteLine(ex.ToString());
   }
}

И эта функция вызывается одним из моих тестов.

Поскольку я указал здесь TransactionScopeOption.Required, я ожидаю, что он будет использовать «окружающую» область транзакции, созданную функцией MyTestInitialize.

Мой тест организован таким образом, чтобы эта функция DoOtherDessertStuffтерпела неудачу и выдавала исключение, поэтому вызов transScope.Complete();не происходит, а откат происходит автоматически при выходе из блока usingв функции AddDessert..

Проблема, с которой я столкнулся, заключается в том, что, поскольку он использует внешнюю область транзакции, созданную в функции MyTestInitialize, мои тестовые вызовы Assertне выполняются, потому что произошел откат области транзакции -, по крайней мере, это то, что я думаю происходит. Я проверил, что Transaction.Current.TransactionInformation.Status— это TransactionStatus.Aborted , поэтому я почти уверен, что это то, что происходит.

Отлично,поэтому я подумал, что изменю свой метод AddDesert, чтобы он выглядел точно так же, как указано выше, за исключением того, что я буду вкладывать область транзакции, а не использовать внешнюю, некоторые мои строки usingвыглядят так :

using (var transScope = new TransactionScope(TransactionScopeOption.RequiresNew))

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

Но я обнаружил, что получаю следующую ошибку:

System.IO.IOException:Невозможно прочитать данные из транспортного соединения:Попытка подключения не удалась, поскольку подключенная сторона не ответила должным образом после период времени или установленное соединение не удалось, поскольку подключенный хост не ответил.

Идеи?

7
задан itsmatt 13 April 2012 в 17:02
поделиться