2009-03-25 34 views
7

Tôi đang cố gắng để đơn vị kiểm tra một vài lớp NET. (Vì lý do thiết kế tốt) yêu cầu DbConnections để làm công việc của họ. Đối với các bài kiểm tra này, tôi có một số dữ liệu nhất định trong bộ nhớ để cung cấp đầu vào cho các lớp này.DbConnection không có Db sử dụng trong bộ nhớ DataSet (hoặc tương tự) như nguồn

Dữ liệu trong bộ nhớ đó có thể dễ dàng được biểu thị dưới dạng DataTable (hoặc Số liệu có chứa DataTable đó), nhưng nếu một lớp khác phù hợp hơn, tôi có thể sử dụng nó.

Nếu tôi bằng cách nào đó có thể nhận DbConnection đại diện cho kết nối với dữ liệu trong bộ nhớ, thì tôi có thể xây dựng đối tượng của mình, yêu cầu họ thực hiện truy vấn của họ dựa trên dữ liệu trong bộ nhớ và đảm bảo rằng kỳ vọng. Có cách nào để nhận dữ liệu trong bộ nhớ trong DbConnection không? Tôi không có quyền tự do cài đặt bất kỳ phần mềm bổ sung nào của bên thứ ba để thực hiện điều này và lý tưởng nhất là tôi không muốn chạm vào đĩa trong khi thử nghiệm.

Trả lời

6

Thay vì tiêu thụ một DbConnection bạn có thể tiêu thụ IDbConnection và thử nó? Chúng tôi làm một cái gì đó tương tự, vượt qua giả lập một DataSet. DataSet.CreateDataReader trả về một DataTableReader kế thừa từ DbDataReader.

Chúng tôi đã bao bọc DbConnection trong giao diện giống như IDbConnection của chúng tôi mà chúng tôi đã thêm phương thức ExecuteReader() trả về một lớp thực hiện các giao diện tương tự như DbDataReader. Trong mô hình của chúng tôi, ExecuteReader chỉ trả về những gì DataSet.CreateDataReader phục vụ.

Loại âm thanh bùng binh, nhưng rất thuận tiện để xây dựng một Tập dữ liệu có thể có nhiều tập hợp kết quả. Chúng tôi đặt tên cho DataTables sau khi procs được lưu trữ mà chúng đại diện cho kết quả của, và IDbConnection giả lập của chúng tôi lấy Datatable phải dựa trên proc khách hàng đang gọi. DataTable cũng thực hiện CreateDataReader vì vậy chúng tôi rất tốt để đi.

0

TypeMock? (Bạn sẽ cần phải 'cài đặt' nó mặc dù).

Hãy cẩn thận giả định rằng Dữ liệu * có thể cung cấp cho bạn các móc thích hợp để thử nghiệm - trường hợp khá tệ nhất của nó nói chung. Nhưng bạn nói lý do thiết kế tốt, vì vậy tôi chắc chắn rằng đó là tất cả được bảo hiểm: D

3

Cách tiếp cận mà tôi đã sử dụng là tạo cơ sở dữ liệu Sqlite trong bộ nhớ. Điều này có thể được thực hiện đơn giản bằng cách kéo gói System.Data.SQLite.Core NuGet vào dự án thử nghiệm đơn vị của bạn, bạn không cần phải cài đặt bất kỳ phần mềm nào khác.

Mặc dù nó có vẻ như là một ý tưởng thực sự rõ ràng, nó đã không được cho đến khi tôi đã nhìn vào các bài kiểm tra đơn vị Dapper mà tôi nghĩ để sử dụng kỹ thuật bản thân mình! Xem phương pháp "GetSqliteConnection" trong

https://github.com/StackExchange/dapper-dot-net/blob/bffb0972a076734145d92959dabbe48422d12922/Dapper.Tests/Tests.cs

Một điều cần phải nhận thức được rằng nếu bạn tạo một sqlite db trong bộ nhớ và tạo và cư bảng, bạn cần phải cẩn thận không để đóng kết nối trước khi thực hiện truy vấn thử nghiệm của bạn vì mở kết nối trong bộ nhớ mới sẽ giúp bạn kết nối với cơ sở dữ liệu trong một cơ sở dữ liệu mới mà bạn vừa chuẩn bị kỹ lưỡng cho các bài kiểm tra của mình! Đối với một số thử nghiệm của tôi, tôi sử dụng một triển khai IDbConnection tùy chỉnh để giữ cho kết nối mở để tránh lỗ hổng này - ví dụ.

https://github.com/ProductiveRage/SqlProxyAndReplay/blob/master/Tests/StaysOpenSqliteConnection.cs

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