Is this the correct way of testing the script?
assert_equal(calculate("Degree", "Sin", 90), Math.sin(90 * Math.PI/180))
Verifica se la tua funzione si comporta in modo identico alla libreria standard. Non se si comporta nel modo in cui ti aspetti che si comporti. È meglio codificare il risultato previsto:
assert_equal(calculate("Degree", "Sin", 90), 1.0)
how am I supposed to write tests for scripts that interact with the web?
I test unitari dovrebbero essere il più indipendenti possibile da altri componenti.
Quando hai il tuo test unitario online e fai una richiesta di rete, non stai solo testando il tuo codice, ma anche la tua connessione internet e il servizio con cui interagisci. Questo è un test di integrazione, non un test unitario. Il problema con questi test è che se falliscono, non sai mai se è il tuo codice che è la colpa, la tua connessione Internet che non funziona o un errore nel servizio con cui interagisci.
In un buon test di unità minimizzi il più possibile le dipendenze da altre risorse. Un metodo comune per questo sono oggetti fittizi . Un oggetto mock è un oggetto che guarda e si comporta identico a un oggetto che astrae una risorsa esterna (come una connessione di rete o un oggetto di connessione al database), ma invece di fare effettivamente una richiesta di rete fa solo fa finta uno e restituisce un risultato hardcoded. Ciò consente di verificare se il codice funziona correttamente senza dipendere dal servizio di terze parti.
Per consentire ai test delle unità di testare il codice con una connessione di rete simulata anziché reale, è necessario seguire una metodologia di sviluppo chiamata injection dependency . Questa metodologia indica che ogni volta che un oggetto ha una dipendenza da una risorsa, non acquisisce la risorsa stessa ma ottiene l'oggetto dall'esterno. Ciò consente al codice di produzione di fornire una vera connessione di rete e il codice di test per fornire una connessione di rete fittizia.
La cosa bella delle connessioni di rete simulate è che puoi implementarne molte diverse con comportamenti diversi. Ciò consente di implementare test per la gestione degli errori nel caso in cui il server non si comporti come al solito. Ad esempio, puoi verificare come si comporta il tuo codice quando il server chiude improvvisamente la connessione, risponde con un messaggio di errore o risponde con garbage totale.