2010-09-15 12 views
5

Sono relativamente nuovo nell'usare TDD e sto leggendo di oggetti di simulazione ultimamente. Ho il seguente test per testare un metodo che data una data restituisce il sabato successivo.Devo usare il mocking per il seguente esempio

[TestMethod()] 
     public void NextSaturdayTest() 
     { 
      DateTime date = new DateTime(); 
      date = DateTime.Parse("2010-08-14"); 
      DateTime expected = new DateTime(); 
      expected = DateTime.Parse("2010-08-21"); 
      DateTime actual; 
      actual = DateExtensions.NextSaturday(date); 
      Assert.AreEqual(expected, actual); 

      date = DateTime.Parse("2010-08-19"); 
      expected = DateTime.Parse("2010-08-21"); 
      actual = DateExtensions.NextSaturday(date); 
      Assert.AreEqual(expected, actual); 
     } 

Prima di tutto, questo rappresenta buone pratiche di prova? In secondo luogo, qual è il vantaggio di utilizzare un framework mock per creare questo test?

Fammi sapere se posso offrire ulteriori informazioni.

Grazie per ogni pensiero

risposta

7

In primo luogo, non fare questo:

DateTime date = new DateTime(); 
date = DateTime.Parse("2010-08-14"); 

Si sta creando una nuova datetime, poi buttarlo via quando si analizza un stringa per ottenere un nuovo datetime.Ricorda, il codice di prova dovrebbe essere ancora un buon codice.

In secondo luogo, un buon test verifica una cosa. Potresti avere più test come ReturnsCorrectNextSaturdayGivenAWednesday, ReturnsCorrectNextSaturdayWhenCrossesEndOfMonth e ReturnsCorrectNextSaturdayWhenCrossesEndOfYear.

Infine, non c'è motivo di prendere in giro qui. Un mock sarebbe appropriato se le tue DateExtensions fossero chiamate in un altro componente (ad esempio un database) e volevi fingere quella chiamata. Quindi, invece di testare DateExtensions + Data Access, dovresti testare solo le DateExtensions e quando ha chiamato il livello di accesso ai dati, sarebbe stato un finto test del tuo test.

5

Mocking viene utilizzato per soddisfare le dipendenze.

Per esempio. Considerate se si dispone di una classe che carica gli utenti da un database utilizzando un IDataLayer (wrapper per il database)

Quando il test, non si vuole mettere alla prova in un database. Rende difficile fornire dati e controllare il risultato. Invece, si prende in giro un oggetto IDataLayer per poter fornire manualmente un utente a UserService. Rende molto più semplice convalidare che UserService faccia ciò che deve fare.

Come per il metodo di prova. Lo suddividerei in due metodi, poiché si stanno eseguendo due test diversi (sullo stesso metodo)

2

In questo caso non è necessario utilizzare una struttura di simulazione e quindi non dovrebbe essere utilizzata.

Il test è abbastanza ragionevole. Io personalmente in linea la maggior parte della data di analisi per una migliore leggibilità:

[TestMethod()] 
    public void NextSaturdayTest() 
    { 
     DateTime actual = DateExtensions.NextSaturday(DateTime.Parse("2010-08-14")); 
     Assert.AreEqual(DateTime.Parse("2010-08-21"), actual); 

     actual = DateExtensions.NextSaturday(DateTime.Parse("2010-08-19")); 
     Assert.AreEqual(DateTime.Parse("2010-08-21"), actual); 
    } 
2

Penso che tu stia bene senza prendere in giro in questo caso. Di solito prendi in giro una sorta di dipendenza (ad esempio, se hai uno DateProvider o qualcosa del genere), ma in questo caso, l'utilizzo di DateTime mi sembra interessante.

Vorrei, tuttavia, ripulire alcuni test. Dovresti limitarti a testare una cosa per metodo, perché se quel metodo di test fallisce, saprai PERCHÉ fallire invece di dover esaminare gli asser e chiedersi se il resto di loro sarebbe passato.

[TestMethod()] 
public void NextSaturdayReturnsCorrectValueStartingFromASaturday() 
{ 
    DateTime date = DateTime.Parse("2010-08-14"); 

    DateTime expected = DateTime.Parse("2010-08-21"); 
    DateTime actual = DateExtensions.NextSaturday(date); 

    Assert.AreEqual(expected, actual); 
} 

[TestMethod()] 
public void NextSaturdayReturnsCorrectValueWithinTheSameWeek() 
{ 
    DateTime date = DateTime.Parse("2010-08-19"); 
    DateTime expected = DateTime.Parse("2010-08-21"); 
    DateTime actual = DateExtensions.NextSaturday(date); 

    Assert.AreEqual(expected, actual); 
} 

E, come altri hanno suggerito, continuare ad espandere la vostra classe di test per includere controlli per alcune delle situazioni più strane che si possono incontrare.