La respuesta corta es no". La parte más interesante es por qué / cómo podría surgir esta situación.
Creo que la confusión está surgiendo porque está tratando de adherirse a prácticas de prueba estrictas (pruebas unitarias versus pruebas de integración, burlas, etc.) para código que no parece adherirse a prácticas estrictas.
Eso no quiere decir que el código sea "incorrecto", o que las prácticas particulares sean mejores que otras. Simplemente que algunas de las suposiciones hechas por las prácticas de prueba pueden no aplicarse en esta situación, y puede ayudar usar un nivel similar de "rigor" en las prácticas de codificación y prueba; o al menos, reconocer que pueden estar desequilibrados, lo que hará que algunos aspectos sean inaplicables o redundantes.
La razón más obvia es que su función está realizando dos tareas diferentes:
- Buscando un
Person
basado en su nombre. Esto requiere pruebas de integración, para asegurarse de que pueda encontrarPerson
objetos que presumiblemente se crean / almacenan en otro lugar.
- Calcular si a
Person
es lo suficientemente mayor, en función de su género. Esto requiere pruebas unitarias, para asegurarse de que el cálculo funcione como se esperaba.
Al agrupar estas tareas en un bloque de código, no puede ejecutar una sin la otra. Cuando desea realizar una prueba unitaria de los cálculos, se ve obligado a buscar unPerson
(ya sea desde una base de datos real o desde un trozo / simulacro). Cuando desee comprobar que la búsqueda se integra con el resto del sistema, también se ve obligado a realizar un cálculo de la edad. ¿Qué debemos hacer con ese cálculo? ¿Deberíamos ignorarlo o verificarlo? Esa parece ser la situación exacta que estás describiendo en tu pregunta.
Si imaginamos una alternativa, podríamos tener el cálculo por sí solo:
def is_old_enough?(person)
if person.male?
return person.age > 21
else
return person.age > 18
end
end
Dado que este es un cálculo puro, no necesitamos realizar pruebas de integración en él.
También podríamos sentir la tentación de escribir la tarea de búsqueda por separado también:
def person_from_name(name = 'filip')
return Person::API.new(name)
end
Sin embargo, en este caso, la funcionalidad es tan cercana Person::API.new
que diría que debería usarla en su lugar (si el nombre predeterminado es necesario, ¿estaría mejor almacenado en otro lugar, como un atributo de clase?).
Al escribir pruebas de integración para Person::API.new
(o person_from_name
) todo lo que necesita preocuparse es si recupera lo esperado Person
; todos los cálculos basados en la edad se realizan en otro lugar, por lo que sus pruebas de integración pueden ignorarlos.