Oltre alla risposta di @ Arseni.
Il tuo metodo dipende dal database. Anche la variabile db
è un'interfaccia che si sta ancora passando per una query che dipende dal tipo di database o dalla versione del database ecc.
I test unitari sono test che sono separati da qualsiasi operazione di I / O (file system, servizio Web o database). Poiché i test unitari sono test che lo sviluppatore deve eseguire ogni 1 minuto e che i tempi di esecuzione dei test devono essere molto brevi (secondi). Mentre i test con operazioni IO coinvolte richiedono più tempo.
I test che dipendono dalle operazioni IO hanno luogo, ma hanno chiamato "Test di integrazione".
Quindi, se il tuo metodo fa parte del livello dati, puoi scrivere test di integrazione in cui puoi eseguire un'altra query SELECT
e asserire che la colonna ClockIn
non è NULL
dopo l'aggiornamento.
Tuttavia, se il tuo metodo fa parte della logica aziendale, per un corretto test dell'unità è necessario ad esempio astrarre questo metodo nell'interfaccia. Quindi mentre si verifica un metodo che utilizzerà UpdateEmployeeClockIn
, si può affermare che il metodo UpdateEmployeeClockIn
è stato chiamato con il parametro corretto.
Il tuo metodo ha un altro caso che può rendere quasi impossibile il test. Si utilizza la funzione datetime del sistema ClockIn = GETUTCDATE()
. La funzione GETUTCDATE()
restituisce sempre un valore diverso. Non è possibile creare un valore atteso rispetto al quale il risultato può essere affermato.
Poiché utilizzi il tempo dal database, ti suggerisco di spostare il metodo temporale nella funzione dedicata nell'interfaccia. Quale può essere preso in giro e restituire il valore previsto definito per il test
public interface IDataService
{
void UpdateEmployeeClockIn(int employeeId, DateTime timeIn);
DateTime GetCurrentTime();
}
Poi nel tuo livello logico aziendale
public class EmployerManager
{
private readonly IDataService _dataService;
public Employer(IDataService dataService)
{
_dataService = dataService;
}
public void UpdateClockinWithCurrentTime(int employerId)
{
DateTime currentTime = _dataService.GetCurrentTime();
_dataService.UpdateEmployeeClockIn(employerId, currentTime);
}
}
In questo caso puoi scrivere unit test per il metodo UpdateClockinWithCurrentTime
in cui puoi testare tramite la simulazione di IDataService
che UpdateEmployeeClockIn
è stato eseguito con i parametri corretti.