2012-03-28 41 views
12

Chúng tôi có một ứng dụng web n-tier để lấy dữ liệu từ SQL Server. Logic truy cập dữ liệu của chúng tôi trả về một SqlDataReader có dữ liệu sau đó được sử dụng để tạo các đối tượng nghiệp vụ của chúng tôi (các đối tượng chuyển dữ liệu a.k.a.).Kiểm tra đơn vị - đặt một SqlDataReader

Chúng tôi muốn xây dựng các bài kiểm tra đơn vị để kiểm tra mã của chúng tôi giải thích dữ liệu được trả về bởi các đối tượng SqlDataReader này để xây dựng các đối tượng nghiệp vụ của chúng tôi.

Do đó, có vẻ như cần thiết để xây dựng sơ khai để thay thế các đối tượng SqlDataReader trong khi kiểm tra đơn vị. Có lẽ là khá điển hình, các đối tượng SqlDataReader của chúng ta thường trả về nhiều bản ghi, mỗi bản ghi có nhiều hàng.

  1. Đây có phải là nỗ lực hợp lý không?
  2. Chúng ta nên làm thế nào để xây dựng các đối tượng sơ khai này?

Nhiều cảm ơn trước

Griff

Trả lời

24

thử nghiệm tự động về cơ bản là luôn luôn là một nỗ lực hợp lý :)

Bước đầu tiên để có thể kiểm tra điều này là phải có lợi nhuận Logic Data Access của bạn an IDataReader thay vì một số SqlDataReader - SqlDataReader triển khai IDataReader, vì vậy không có vấn đề gì ở đó.

Trong thử nghiệm đơn vị của bạn, bạn có thể xây dựng và điền các đối tượng DataTable theo cách thủ công và gọi dataTable.CreateDataReader() để nhận được IDataReader để chuyển vào đối tượng đang thử nghiệm.

Sửa

Cung cấp các bài kiểm tra của bạn với một tập hợp các dữ liệu mẫu, tôi muốn đề nghị sử dụng một ObjectMother cho mỗi bảng dữ liệu bạn sử dụng, giữ cho việc tạo ra các bảng dữ liệu ở một nơi chuyên dụng. Sau đó, bạn có thể đặt các phương thức trên mỗi lớp ObjectMethod để cập nhật dữ liệu nhất định theo cách được đánh máy mạnh mẽ. Ví dụ:

public class PersonalDetailsBuilder 
{ 
    private DataTable _dataTable; 

    public PersonalDetailsBuilder CreateNewTable() 
    { 
     this._dataTable = new DataTable("CustomerPersonalDetails") 
     { 
      Columns = new[] 
      { 
       new DataColumn("CustomerId", typeof(int)), 
       new DataColumn("CustomerName", typeof(string)) 
      } 
     }; 

     return this; 
    } 

    public PersonalDetailsBuilder AddStandardData(int numberOfRows = 3) 
    { 
     foreach (int i in Enumerable.Range(1, numberOfRows + 1)) 
     { 
      this.AddRow(i, "Customer " + i); 
     } 

     return this; 
    } 

    public PersonalDetailsBuilder AddRow(int customerId, string customerName) 
    { 
     this._dataTable.Rows.Add(customerId, customerName); 

     return this; 
    } 

    public IDataReader ToDataReader() 
    { 
     return this._dataTable.CreateDataReader(); 
    } 
} 

... mà sau đó bạn có thể sử dụng như thế này để có được một trình đọc dữ liệu:

IDataReader customerDetailsReader = new PersonalDetailsBuilder() 
    .CreateNewTable() 
    .AddStandardData() 
    .AddRow(17, "Customer 17") 
    .ToDataReader(); 
+0

Hãy tưởng tượng rằng một trong những đối tượng IDataReader của chúng tôi trả về thông tin chi tiết về khách hàng: RS1 = chi tiết cá nhân; rs2 = quyền; rs3 - xxx vv Hầu hết các thử nghiệm sẽ sử dụng điều này như một tập dữ liệu mặc định. Một số thử nghiệm có thể muốn sử dụng hầu hết các giá trị này, nhưng ghi đè một số thuộc tính trong datatables. Làm thế nào là dễ dàng? Giống như thừa kế .... – DrGriff

+0

Tôi không chắc tôi hiểu - ý của bạn là một trình đọc dữ liệu đơn lẻ cho nhiều tập hợp kết quả hoặc một bộ đọc dữ liệu? Trong mọi trường hợp, tôi đã cập nhật câu trả lời của mình. –

+0

Tại sao lại là downvote? Bất kỳ ai...? –