Come e cosa dovrei essere (unità) di test in questo metodo?

4

Sono relativamente nuovo ai test unitari e ho una domanda su cosa / come dovrei provare un determinato metodo. Per il seguente metodo (psudo-c #) che ho creato (non un esempio di vita reale) per cosa testesti?

Inizialmente, i miei pensieri sarebbero di testare l'output con variazioni sul dizionario dei campi modulo, ad es. Valori validi, non validi, mancanti. Tuttavia, mi chiedo anche come testare per assicurarsi che i valori degli oggetti siano stati modificati al valore corretto e che sia stato tentato di inviare il messaggio di posta elettronica corretto (ovviamente entrambi i servizi potrebbero / potrebbero essere presi in giro).

Spero che ciò che sto chiedendo abbia senso, apprezzo che questa è una domanda soggettiva e le risposte potrebbero essere "dipende";)

public bool ProcessInput(Dictionary<string, string> formFields, ObjService objService, EmailService emailService)
    {
        try
        {
                   // Get my object id
                   int objId;
                   if(!int.TryParse(formField["objId"], out objId)
                   {
                      return false;
                   }

                   // Update my object - would you validate the save against a DB or a mocked inmemory db?
                   var myObj = objService.Find(objId);
                   myObj.Name = formField["objName"];
                   objService.Save(myObj);

                   // Send an email - how would you test to make sure content, recipient, etc was correct? 
                   emailService.SendEmail(formField("email"), "Hello World");

                   return true;    
        }
        catch(Exception ex)
        {
        return false;
        }
    }
    
posta user460667 31.03.2012 - 14:09
fonte

2 risposte

8

Sei sulla strada giusta. Dovresti testare (almeno) i seguenti scenari:

  1. ID oggetto non valido (non intero) : il metodo dovrebbe restituire false e non dovrebbero essere apportate modifiche (ad esempio, nessun servizio chiamato)
  2. ID oggetto sconosciuto : il metodo dovrebbe probabilmente comportarsi in modo simile al caso 1 (ma attualmente non sembra gestirlo)
  3. ID oggetto valido, nome valido nel campo modulo : l'oggetto deve essere salvato nel servizio oggetto, l'email deve essere inviata
  4. ID oggetto valido ma nome mancante nel campo modulo : simile al caso 3 ???

Sia i ObjService che EmailService devono essere presi in giro nei test, quindi è possibile verificare che vengano (non) chiamati con i parametri previsti.

    
risposta data 31.03.2012 - 14:16
fonte
4

Beh, non sono un vero esperto in materia, ma ho fatto parte del materiale del "test unitario".

Idealmente, per il test delle unità, i parametri del tuo metodo devono comprendere tipi astratti, qualcosa come

 public bool ProcessInput(IDictionary<string, string> formFields, IObjService objService, IEmailService emailService)

E quindi ciò che vuoi veramente testare è ProcessInput e mettere in ridicolo il servizio di posta elettronica e ObjService creando un oggetto fittizio di IEmailService e IObjservice usando alcune librerie come Moq.

Per rispondere a ciò che devi testare, potresti prendere in considerazione alcuni dei casi di test riportati di seguito

  • Passaggio di un oggetto nullo in formFields e vedere come il tuo metodo tratti gli oggetti nulli
  • Passaggio di tipi di chiavi non analizzabili nel dizionario
  • Passare un objID nel dizionario che non può essere trovato da objService.Find (objId)
  • Alcuni flussi funzionali che verificano caso felice ...

Questo è ciò che mi viene in mente. Spero che questo ti aiuti. Non esitate a discutere ulteriormente se c'è qualcosa che mi manca.

    
risposta data 31.03.2012 - 14:31
fonte

Leggi altre domande sui tag