Secondo la documentazione per il modulo delegate
rotaie:
Se l'oggetto delegato è pari a zero un viene sollevata un'eccezione e ciò accade indipendentemente dal fatto che nil risponda al metodo delegato. È possibile ottenere un nulla invece con l'opzione: allow_nil.
vorrei creare un oggetto Event event
con un nullo , o impostare event.league = nil
, quindi provare a chiamare event.name
, e controllare che esso solleva un'eccezione, dato che questo è quello che dovrebbe accadere quando allow_nil
è falso (che è anche l'impostazione predefinita). So RSpec ha questo idioma per il test eccezione:
lambda{dangerous_operation}.should raise_exception(optional_exception_class)
io non sono sicuro se shoulda ha questo costrutto, anche se ci are some articles, kinda old, about how to get this behavior in shoulda.
Penso che valga la pena di testare se si tratta di un comportamento che gli utenti di questa classe possono aspettarsi o supporre accadrà, il che penso sia probabilmente vero in questo caso. Non vorrei estendere shoulda per testare "dovrebbe delegare", perché sembra più dipendente dall'implementazione: stai dicendo che il tuo evento dovrebbe sollevare un'eccezione se provi a chiamare #name
quando ha una lega nil. Non è davvero importante per gli utenti di Event come lo stai facendo. Andrei anche così lontano, se vuoi affermare e prendere nota di questo comportamento, per verificare che abbia la stessa semantica di League#name
, senza menzionando qualcosa su delegate
, poiché questo è un approccio incentrato sul comportamento.
costruire il tuo test in base a come il codice di comportamento, non su come è costruito - testando in questo modo è una migliore documentazione per coloro che inciampano nelle vostre prove, in quanto sono più interessati alla domanda "perché è il mio evento gettando? " o "cosa può causare l'evento da lanciare?" di "è questo evento che delega?".
È possibile evidenziare questo tipo di situazione immaginando quali guasti potrebbero verificarsi se si modifica il codice in un modo che gli utenti di Event non dovrebbero preoccuparsi. Se a loro non importa, il test non dovrebbe rompersi quando lo cambi. Che cosa succede se si desidera, ad esempio, gestire autonomamente la delega, scrivendo una funzione #name
che prima registra o incrementa un contatore e quindi delegati a ? testando il comportamento di eccezione, sei protetto da questa modifica, ma testando se Event è un delegato, interromperesti quel test quando apporti questa modifica - e quindi il tuo test non stava guardando ciò che è veramente circa la chiamata a #name
.
In ogni caso, è tutto un semplice discorso di soapbox. tl; dr: testalo se è un comportamento su cui qualcuno potrebbe fare affidamento.Tutto ciò che non è testato è il gatto di Shroedinger: rotto e non rotto allo stesso tempo. Sinceramente, per la maggior parte del tempo questo può essere OK: è una questione di gusti se si vuole dire qualcosa di rigoroso e definitivo su come il sistema dovrebbe comportarsi, o semplicemente lasciare che sia un "comportamento non specificato".
Si potrebbe voler esaminare questo - qualcun altro ha fatto il lavoro per voi. https://gist.github.com/txus/807456 – weltschmerz