Do một vài hạn chế, tôi không thể sử dụng Khung thực thể và do đó cần sử dụng các kết nối SQL, lệnh và giao dịch theo cách thủ công.Thử nghiệm đơn vị với các giao dịch thủ công và giao dịch theo lớp
Trong khi viết kiểm tra đơn vị cho các phương thức gọi các hoạt động lớp dữ liệu này, tôi đã gặp phải một số vấn đề.
Đối với các bài kiểm tra đơn vị I NEED để thực hiện chúng trong Giao dịch vì hầu hết các thao tác đang thay đổi dữ liệu theo bản chất của chúng và do đó thực hiện chúng bên ngoài Giao dịch có vấn đề. Vì vậy, tôi cần phải đặt một giao dịch xung quanh những (không có cam kết bắn vào cuối).
Bây giờ tôi có 2 biến thể khác nhau về cách thức hoạt động của các phương thức BL này. Một số ít có Giao dịch bên trong chúng trong khi một số khác không có Giao dịch. Cả hai biến thể này đều gây ra vấn đề.
giao dịch Layered: Ở đây tôi nhận được lỗi rằng DTC hủy các giao dịch phân phối do hết giờ (mặc dù thời gian chờ đã được thiết lập để 15 phút và nó đang chạy chỉ 2 phút).
Chỉ 1 giao dịch: Ở đây tôi gặp lỗi về trạng thái Giao dịch khi tôi đến đường dây
"new SQLCommand"
trong phương thức được gọi.
Câu hỏi của tôi ở đây là những gì tôi có thể làm để sửa lỗi này và kiểm tra đơn vị với các giao dịch theo lớp bình thường và thủ công?
Unit phương pháp thử nghiệm ví dụ:
using (SqlConnection connection = new SqlConnection(Properties.Settings.Default.ConnectionString))
{
connection.Open();
using (SqlTransaction transaction = connection.BeginTransaction())
{
MyBLMethod();
}
}
Ví dụ cho một giao dịch sử dụng phương pháp (rất đơn giản)
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();
}
}
Ví dụ cho một giao dịch không sử dụng phương pháp
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();
}
Vì bạn phải sử dụng 'SqlConnection', bạn không thể kiểm tra đơn vị; bạn đang thực hiện các thử nghiệm tích hợp. Vì vậy, thay vì làm tất cả mọi thứ nhưng cam kết, sử dụng một DB thử nghiệm (mà bạn có thể xây dựng afresh lúc bắt đầu chạy thử nghiệm) và chỉ cần kiểm tra tương tác DB. –
Những gì anh ta nói. Bạn nên sử dụng các snapshot cơ sở dữ liệu để tạo ra dữ liệu được biết rõ về từng dữ liệu đã biết. – Ewan
Điều đó có nghĩa là sau đó tôi sẽ cần tạo lại một cơ sở dữ liệu toàn bộ (có thể mở rộng rất nhiều dữ liệu) cho mỗi lần chạy thử nghiệm đơn vị? b (có thể tăng gấp đôi hoặc gấp ba lần thời gian chạy sau đó đến một vài phút) – Thomas