Z powodu kilku ograniczeń nie mogę korzystać z encji podmiotu, dlatego należy ręcznie korzystać z połączeń, poleceń i transakcji SQL.Testy jednostkowe z transakcjami ręcznymi i transakcjami wielowarstwowymi
Podczas pisania testów jednostkowych metod wywoływania tych operacji warstwy danych natknąłem się na kilka problemów.
Do testów jednostkowych I POTRZEBUJEMY, aby wykonać je w Transakcji, ponieważ większość operacji zmienia dane ze względu na ich charakter, a zatem wykonywanie ich poza Transakcją jest problematyczne, ponieważ spowoduje to zmianę wszystkich podstawowych danych. W związku z tym muszę umieścić transakcję wokół nich (bez zatwierdzenia commit na końcu).
Teraz mam 2 różne warianty działania tych metod BL. Niektóre z nich zawierają same transakcje, podczas gdy inne nie zawierają żadnych transakcji. Oba warianty powodują problemy.
warstwami transakcja: Tutaj mam błędy DTC anulował transakcję rozproszoną z powodu przekroczenia limitu czasu (choć limit czasu jest ustawiony na 15 minut i jest on uruchomiony tylko 2 minuty).
Tylko 1 Transakcja: Tutaj pojawia się błąd dotyczący stanu transakcji, gdy przychodzę do linii
"new SQLCommand"
w wywołanej metodzie.
Moje pytanie brzmi: co mogę zrobić, aby to poprawić i uzyskać testowanie jednostkowe z ręcznymi normalnymi i wielowarstwowymi transakcjami?
Jednostka Metoda badania przykład:
using (SqlConnection connection = new SqlConnection(Properties.Settings.Default.ConnectionString))
{
connection.Open();
using (SqlTransaction transaction = connection.BeginTransaction())
{
MyBLMethod();
}
}
Przykład transakcję za pomocą metody (uproszczonej)
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();
}
}
przykład dla nie transakcji przy użyciu metody
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();
}
Ponieważ musisz użyć 'SqlConnection', nie możesz testować jednostki; robisz testy integracyjne. Więc zamiast robić wszystko, ale zatwierdzaj, użyj testu DB (który możesz skonstruować od nowa na początku testu) i przetestuj interakcję DB. –
Co powiedział. Powinieneś używać migawek bazy danych do tworzenia czystych baz danych za każdym razem. – Ewan
Oznacza to, że musiałbym odtworzyć całą (prawdopodobnie obejmującą wiele GB danych) bazy danych dla każdego uruchomienia testu jednostkowego? b (który może podwoić lub potroić czas pracy do kilku minut) – Thomas