Tipi di ritorno vuoti / Subroutine sono vecchie notizie. Non ho creato un tipo di ritorno Void (a meno che non fossi estremamente pigro) da circa 8 anni (Dal momento della risposta, quindi solo un po 'prima che questa domanda fosse posta).
Invece di un metodo come:
public void SendEmailToCustomer()
Crea un metodo che segua il paradigma int.TryParse () di Microsoft:
public bool TrySendEmailToCustomer()
Forse non ci sono informazioni che il tuo metodo deve restituire per l'utilizzo a lungo termine, ma restituire lo stato del metodo dopo aver eseguito il suo lavoro è di grande utilità per il chiamante.
Inoltre, bool non è l'unico tipo di stato. Esistono diverse volte in cui una subroutine precedentemente creata può effettivamente restituire tre o più stati diversi (buono, normale, cattivo, ecc.). In quei casi, useresti semplicemente
public StateEnum TrySendEmailToCustomer()
Tuttavia, mentre Try-Paradigm risponde in qualche modo a questa domanda su come testare un ritorno vuoto, ci sono anche altre considerazioni. Ad esempio, durante / dopo un ciclo "TDD", dovresti essere "Refactoring" e notare che stai facendo due cose con il tuo metodo ... infrangendo così il "Principio di responsabilità singola". Quindi dovrebbe essere curato prima. In secondo luogo, potresti aver identificato una dipendenza ... stai toccando i dati "persistenti".
Se si stanno eseguendo le operazioni di accesso ai dati nel metodo in questione, è necessario eseguire il refactoring in un'architettura a più livelli o più livelli. Ma possiamo supporre che quando dici "Le stringhe vengono quindi inserite in un database", in realtà intendi che stai chiamando un livello di logica aziendale o qualcosa del genere. Ya, lo supponiamo.
Quando il tuo oggetto viene istanziato, ora capisci che il tuo oggetto ha dipendenze. Questo è quando è necessario decidere se si intende eseguire l'iniezione di dipendenza sull'oggetto o sul metodo. Ciò significa che il tuo costruttore o il metodo in questione necessita di un nuovo parametro:
public <Constructor/MethodName> (IBusinessDataEtc otherLayerOrTierObject, string[] stuffToInsert)
Ora che è possibile accettare un'interfaccia dell'oggetto livello business / dati, è possibile deriderlo durante i test delle unità e non avere dipendenze o timori di test di integrazione "accidentale".
Quindi, nel tuo codice live, passi un IBusinessDataEtc
oggetto REALE . Ma nel tuo Test unitario, passi un IBusinessDataEtc
oggetto MOCK . In quel Mock, puoi includere Proprietà Non-Interface simili int XMethodWasCalledCount
o qualcosa il cui stato (i) viene aggiornato quando vengono chiamati i metodi dell'interfaccia.
Quindi il tuo test unit esaminerà i tuoi metodi in questione, eseguirà la logica che hanno e chiamerà uno o due o un set selezionato di metodi nel tuo IBusinessDataEtc
oggetto. Quando esegui le tue asserzioni alla fine del test unitario, hai un paio di cose da testare ora.
- Lo stato della "subroutine" che ora è un metodo Try-Paradigm.
- Lo stato del tuo
IBusinessDataEtc
oggetto Mock .
Per ulteriori informazioni sulle idee di Iniezione delle dipendenze a livello di costruzione ... per quanto riguarda i test unitari ... esaminare i modelli di progettazione del costruttore. Aggiunge un'interfaccia e una classe in più per ogni interfaccia / classe corrente che possiedi, ma sono molto minuscole e forniscono enormi ENTRAMENTI funzionalità per un migliore Unit Test.