2010-08-16 29 views
5

TRẢ LỜI: Tôi chưa xóa các ConnectionPool của mình.Không thể Thả Cơ sở dữ liệu sau khi Kiểm tra Đơn vị

Kịch bản giải quyết là:

thiết lập:

  1. Kiểm tra xem cơ sở dữ liệu 'TEMP_NUnit' (SQL Server 2005) tồn tại trên trường hợp địa phương
  2. Nếu nó tồn tại, thả nó.
  3. Tạo cơ sở dữ liệu trống mới có tên 'TEMP_NUnit'.

Test:

  1. Khởi tạo các 'Cơ sở dữ liệu nâng cấp' thành phần.
  2. Kiểm tra xem các thuộc tính thiết yếu của thành phần có được đặt chính xác không.
  3. điểm thành phần tại các cơ sở dữ liệu trống và gọi .Upgrade()
  4. Kiểm tra xem việc nâng cấp thực sự làm việc

TearDown:

  1. SqlConnection.ClearAllPools();
  2. Drop cơ sở dữ liệu 'TEMP_NUnit'.

Câu hỏi gốc nằm dưới màn hình đầu tiên.


Hi All

Kịch bản thử nghiệm là:

thiết lập:

  1. Kiểm tra xem cơ sở dữ liệu 'TEMP_NUnit' (SQL Server 2005) tồn tại trên trường hợp địa phương
  2. Nếu nó tồn tại, hãy thả nó.
  3. Tạo cơ sở dữ liệu trống mới có tên 'TEMP_NUnit'.

Test:

  1. Khởi tạo các 'Cơ sở dữ liệu nâng cấp' thành phần.
  2. Kiểm tra xem các thuộc tính thiết yếu của thành phần có được đặt chính xác không.
  3. điểm thành phần tại các cơ sở dữ liệu trống và gọi .Upgrade()
  4. Kiểm tra xem việc nâng cấp thực sự làm việc

TearDown:

  1. Drop cơ sở dữ liệu 'TEMP_NUnit'.

Mọi thứ sẽ ổn cho đến khi tôi đến giai đoạn TearDown. Tôi luôn luôn nhận được lỗi sau:

Cannot drop database "TEMP_NUnit" because it is currently in use.

này là khó hiểu với tôi, vì tôi đóng cửa (gọi một cách rõ ràng conn.Close trong cuối cùng báo cáo) và xử lý (thông qua sử dụng tuyên bố) tất cả các DbConnection của tôi đối tượng một cách chính xác. Không nên có bất cứ thứ gì chạy trên cơ sở dữ liệu "TEMP_NUnit" vào thời điểm TearDown xuất hiện.

Nếu tôi đóng NUnit và sau đó mở lại, bước 2 của Thiết lập luôn hoạt động đầu tiên.

Tôi không chắc mình đang làm gì sai ở đây. Bất kỳ con trỏ nào đi đúng hướng sẽ được đánh giá cao.

Trả lời

5

Ah, nhưng bạn quên làm điều này chút trước khi thả các cơ sở dữ liệu:

SqlConnection.ClearAllPools(); 

Theo mặc định, hồ bơi kết nối sẽ duy trì một kết nối đến cơ sở dữ liệu, ngay cả khi bạn đóng nó trước đây. Làm SqlConnection.ClearAllPools() sẽ thực sự buộc tất cả các kết nối phải đóng. Sau đó, bạn có thể kết nối với master và thả cơ sở dữ liệu tạm thời.

Nó đã gây ra cho tôi khá một số lượng đau buồn trước :)

+0

Bingo! Cảm ơn người đàn ông. –

0

Có thể muốn xem xét Michael Feathers Unit Testing Rules:

Một thử nghiệm không phải là một bài kiểm tra đơn vị nếu:

  • Nó nói chuyện với cơ sở dữ liệu
  • Giao tiếp qua mạng
  • Nó chạm vào hệ thống tệp
  • Không thể chạy cùng lúc với bất kỳ kiểm tra đơn vị nào khác của bạn
  • Bạn phải làm những việc đặc biệt cho môi trường của mình (chẳng hạn như chỉnh sửa tệp cấu hình) để chạy.
+1

Liên kết rất tốt. Tôi vẫn sẽ viết bài kiểm tra này, bởi vì tôi cần một cái gì đó như thế này mà có thể kiểm tra một cách nhanh chóng có hay không mã nâng cấp hoạt động trên một loạt các kịch bản. Tuy nhiên, ý tưởng chop nhị phân là một ý tưởng tốt. Tôi sẽ tách bài kiểm tra này ra thành dll riêng của nó. Thanaks. –

+1

Lưu ý rằng bài viết trên cũng đồng ý rằng "chúng tôi cần cả hai loại kiểm tra, nhưng các thử nghiệm đơn vị" thuần túy "này bị định giá thấp." Vì vậy, một thử nghiệm (không đơn vị) mà nói chuyện với cơ sở dữ liệu là tốt, thực sự. –

Các vấn đề liên quan