Я использую 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:Невозможно прочитать данные из транспортного соединения:Попытка подключения не удалась, поскольку подключенная сторона не ответила должным образом после период времени или установленное соединение не удалось, поскольку подключенный хост не ответил.
Идеи?