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