2012-03-28 13 views
12

Mamy n-warstwową aplikację internetową, która pobiera dane z SQL Server. Nasza logika dostępu do danych zwraca SqlDataReader, którego dane są następnie używane do tworzenia naszych obiektów biznesowych (a.k.a. obiektów przenoszenia danych).Testowanie jednostkowe - odgałęzienie SqlDataReader

Chcemy zbudować testy jednostkowe, aby sprawdzić nasz kod, który interpretuje dane zwrócone przez te obiekty SqlDataReader, aby zbudować nasze obiekty biznesowe.

Dlatego wydaje się konieczne tworzenie stubów zastępujących obiekty SqlDataReader podczas testowania jednostkowego. Jak prawdopodobnie dość typowe, nasze obiekty SqlDataReader zwykle zwracają wiele zestawów rekordów, każdy z wieloma wierszami.

  1. Czy to rozsądne przedsięwzięcie?
  2. Jak powinniśmy budować te niedopałki?

Wiele z góry dzięki

Griff

Odpowiedz

24

Automatyczne testowanie jest w zasadzie zawsze rozsądne starania :)

Twój pierwszy krok, aby móc przetestować to jest mieć swój powrót logiki dostępu do danych IDataReader zamiast z SqlDataReader - SqlDataReader implementuje , więc nie ma problemów.

W swoich testach jednostkowych można następnie ręcznie budować i wypełniać obiekty DataTable i wywoływać dataTable.CreateDataReader(), aby uzyskać IDataReader przejść do badanego obiektu.

Edit

podać swoje testy z zestawem przykładowych danych, polecam stosując ObjectMother dla każdej tabeli danych użyć, utrzymując tworzenie tabel danych w jednym dedykowanym miejscu. Następnie możesz umieścić metody na każdej klasie ObjectMethod, aby zaktualizować określone dane w sposób mocno napisany. Na przykład:

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(); 
    } 
} 

... które można następnie wykorzystać tak, aby czytnik danych:

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

wyobrazić, że jeden z naszych obiektów IDataReader zwraca szczegółów dotyczących klientów: RS1 = dane osobowe; rs2 = uprawnienia; rs3 - xxx itd. Większość testów użyje tego jako domyślnego zestawu danych. Niektóre testy mogą chcieć wykorzystać większość tych wartości, ale zastąpić niektóre właściwości w datatables. Jak łatwo to zrobić? Prawie jak dziedziczenie ... – DrGriff

+0

Nie jestem pewien, czy rozumiem - masz na myśli jeden czytnik danych dla wielu zestawów wyników lub zestaw czytników danych? W każdym razie zaktualizowałem swoją odpowiedź. –

+0

Dlaczego upadek? Ktoś...? –

Powiązane problemy