Из-за нескольких ограничений я не могу использовать сущность Framework и поэтому должен вручную использовать SQL-соединения, команды и транзакции.
При написании модульных тестов для методов, вызывающих эти операции с данными, я наткнулся на несколько проблем.
Для модульных тестов мне НЕОБХОДИМО выполнять их в транзакции, так как большинство операций меняют данные по своей природе, и поэтому их выполнение вне транзакции проблематично, так как это изменило бы все базовые данные. Таким образом, мне нужно поставить транзакцию вокруг них (без фиксации в конце).
Теперь у меня есть два разных варианта использования этих методов BL. У некоторых есть Сделки внутри себя, в то время как у других нет Сделок вообще. Оба этих варианта вызывают проблемы.
-
Layered Transaction: Здесь я получаю ошибки, которые DTC отменяет распределенную транзакцию из-за тайм-аутов (хотя тайм-аут устанавливается на 15 минут, и он работает всего на 2 минуты).
-
Только 1 транзакция: здесь я получаю сообщение об ошибке состояния транзакции, когда я прихожу к строке
"new SQLCommand"
в вызываемом методе.
Мой вопрос здесь, что я могу сделать, чтобы исправить это и получить модульное тестирование с ручными нормальными и многослойными транзакциями?
Пример метода тестирования:
using (SqlConnection connection = new SqlConnection(Properties.Settings.Default.ConnectionString))
{
connection.Open();
using (SqlTransaction transaction = connection.BeginTransaction())
{
MyBLMethod();
}
}
Пример транзакции с использованием метода (очень упрощенный)
using (SqlConnection connection = new SqlConnection(Properties.Settings.Default.ConnectionString))
{
connection.Open();
using (SqlTransaction transaction = connection.BeginTransaction())
{
SqlCommand command = new SqlCommand();
command.Connection = connection;
command.Transaction = transaction;
command.CommandTimeout = 900; // Wait 15 minutes before a timeout
command.CommandText = "INSERT ......";
command.ExecuteNonQuery();
// Following commands
....
Transaction.Commit();
}
}
Пример для не транзакции с использованием метода
using (SqlConnection connection = new SqlConnection(Properties.Settings.Default.ConnectionString))
{
connection.Open();
SqlCommand command = new SqlCommand();
command.Connection = connection;
command.CommandTimeout = 900; // Wait 15 minutes before a timeout
command.CommandText = "INSERT ......";
command.ExecuteNonQuery();
}