La risposta breve è "No". La parte più interessante è perché / come questa situazione potrebbe sorgere.
Penso che la confusione stia sorgendo perché stai cercando di aderire a rigorose pratiche di test (unit test vs test di integrazione, derisione, ecc.) Per il codice che non sembra aderire a pratiche rigorose.
Questo non vuol dire che il codice sia "sbagliato" o che determinate pratiche siano migliori di altre. Semplicemente che alcune delle ipotesi formulate dalle pratiche di sperimentazione potrebbero non applicarsi in questa situazione e potrebbe aiutare a usare un livello simile di "rigore" nelle pratiche di codifica e nelle pratiche di sperimentazione; o almeno, riconoscere che potrebbero essere sbilanciati, il che renderà alcuni aspetti inapplicabili o ridondanti.
Il motivo più ovvio è che la tua funzione sta eseguendo due diversi compiti:
- Cercare un in
Person
base al loro nome. Ciò richiede test di integrazione, per assicurarsi che possano trovare Person
oggetti che presumibilmente vengono creati / memorizzati altrove.
- Calcolare se a
Person
è abbastanza vecchio, in base al loro genere. Ciò richiede un test unitario, per assicurarsi che il calcolo funzioni come previsto.
Raggruppando queste attività in un blocco di codice, non è possibile eseguirne una senza l'altra. Quando si desidera testare l'unità dei calcoli, si è costretti a cercare un Person
(da un database reale o da uno stub / mock). Quando si desidera verificare che la ricerca si integri con il resto del sistema, si è anche costretti a eseguire un calcolo sull'età. Cosa dovremmo fare con quel calcolo? Dovremmo ignorarlo o controllarlo? Questa sembra essere la situazione esatta che stai descrivendo nella tua domanda.
Se immaginiamo un'alternativa, potremmo avere il calcolo da soli:
def is_old_enough?(person)
if person.male?
return person.age > 21
else
return person.age > 18
end
end
Poiché si tratta di un calcolo puro, non è necessario eseguire test di integrazione su di esso.
Potremmo anche essere tentati di scrivere anche l'attività di ricerca separatamente:
def person_from_name(name = 'filip')
return Person::API.new(name)
end
Tuttavia, in questo caso la funzionalità è così vicina Person::API.new
che direi che dovresti usarla invece (se il nome predefinito è necessario, sarebbe meglio archiviato altrove, come un attributo di classe?).
Quando si scrivono test di integrazione per Person::API.new
(o person_from_name
) tutto ciò che occorre preoccuparsi è se si ritorna indietro al previsto Person
; tutti i calcoli basati sull'età sono curati altrove, quindi i test di integrazione possono ignorarli.