A resposta curta é não". A parte mais interessante é por que / como essa situação pode surgir.
Eu acho que a confusão está surgindo porque você está tentando aderir a práticas estritas de teste (testes de unidade vs testes de integração, zombaria etc.) para código que parece não aderir a práticas estritas.
Isso não quer dizer que o código esteja "errado" ou que práticas específicas sejam melhores que outras. Simplesmente algumas das suposições feitas pelas práticas de teste podem não se aplicar nessa situação e pode ajudar a usar um nível semelhante de "rigor" nas práticas de codificação e práticas de teste; ou pelo menos, reconhecer que eles podem estar desequilibrados, o que fará com que alguns aspectos sejam inaplicáveis ou redundantes.
O motivo mais óbvio é que sua função está executando duas tarefas diferentes:
- Procurando um com
Person
base em seu nome. Isso requer teste de integração, para garantir que ele possa encontrar Person
objetos que, presumivelmente, foram criados / armazenados em outro lugar.
- Calculando se a
Person
tem idade suficiente, com base em seu sexo. Isso requer teste de unidade, para garantir que o cálculo funcione conforme o esperado.
Ao agrupar essas tarefas em um bloco de código, você não pode executar uma sem a outra. Quando você deseja testar os cálculos da unidade, é forçado a procurar um Person
(a partir de um banco de dados real ou de um esboço / simulação). Quando você deseja testar se a pesquisa se integra ao resto do sistema, você também é obrigado a executar um cálculo da idade. O que devemos fazer com esse cálculo? Devemos ignorá-lo ou verificá-lo? Essa parece ser a situação exata que você está descrevendo na sua pergunta.
Se imaginarmos uma alternativa, poderemos ter o cálculo por conta própria:
def is_old_enough?(person)
if person.male?
return person.age > 21
else
return person.age > 18
end
end
Como esse é um cálculo puro, não precisamos executar testes de integração nele.
Também podemos ficar tentados a escrever a tarefa de pesquisa separadamente:
def person_from_name(name = 'filip')
return Person::API.new(name)
end
No entanto, neste caso, a funcionalidade é tão próxima Person::API.new
que eu diria que você deveria usá-lo (se o nome padrão for necessário, seria melhor armazenado em outro lugar, como um atributo de classe?).
Ao escrever testes de integração para Person::API.new
(ou person_from_name
) tudo o que você precisa se preocupar é se você recebe de volta o esperado Person
; todos os cálculos baseados em idade são resolvidos em outro lugar, para que seus testes de integração possam ignorá-los.