From my knowledge, unit test doesn't connect with external services likes database, files,
Hai ragione. Stai descrivendo un test di integrazione. Integra tutti o alcuni componenti nel sistema e li testa.
how to write an actual unit test for restful api ?
In realtà non collaudi l'API restful perché è troppo grande. Invece unità testare le unità che compongono l'api riposante. Con la maggior parte delle API restful, si scrivono semplici funzioni e quindi si configura il framework per richiamare le funzioni assegnate a un percorso specifico. Quindi unit test quelle funzioni.
Ad esempio nella mia API REST, l'autorizzazione è una preoccupazione che viene gestita nella funzione endpoint. Ho una funzione come questa (pseudocodice):
def insertBusiness(...)
if !auth.authenticated
return Unauthenticated
if !auth.getPermissions.contain(ADMIN)
return Unauthorized
else
bll.insertBusiness(...)
return Created
Questa funzione è configurata nel mio framework REST per essere eseguita quando una richiesta POST viene fatta su /businesses per esempio.
È utile test delle unità di scrittura per coprire questa funzione. Gli oggetti bll e auth devono essere derisi - altrimenti questo sarebbe un test di integrazione. Ecco alcuni esempi di casi di test:
- Quando
auth.authenticated restituisce false, insertBusiness deve restituire Unauthenticated
- Quando
auth.getPermissions non contiene ADMIN , insertBusiness deve restituire Unauthorized
- Quando
auth.authenticated genera un'eccezione, insertBusiness deve generare un'eccezione
- Quando
auth.getPermissions genera un'eccezione, insertBusiness deve generare un'eccezione
- Quando
auth.authenticated restituisce null (se il tipo è annullabile o deselezionata), insertBusiness deve generare un'eccezione
-
auth.getPermissions restituisce null (se il tipo è annullabile o deselezionata), insertBusiness deve generare un'eccezione
- Quando
bll.insertBusiness genera un'eccezione, insertBusiness deve generare un'eccezione
- Quando un utente autenticato con autorizzazioni
ADMIN , insertBusiness deve restituire Created
Questi test non sono implementati effettuando richieste REST attraverso il framework (anche in questo caso si tratterebbe di un test di integrazione). Sono implementati effettuando chiamate direttamente su insertBusiness