Короткий ответ - нет". Более интересная часть - почему / как эта ситуация может возникнуть.
Я думаю, что путаница возникает из-за того, что вы пытаетесь придерживаться строгих методов тестирования (модульные тесты или интеграционные тесты, макеты и т. Д.) Для кода, который, кажется, не придерживается строгих правил.
Это не значит, что код «неправильный», или что определенные практики лучше, чем другие. Просто некоторые допущения, сделанные практиками тестирования, могут не применяться в этой ситуации, и это может помочь использовать подобный уровень «строгости» в практиках кодирования и практиках тестирования; или, по крайней мере, признать, что они могут быть несбалансированными, что приведет к неприменимости или избыточности некоторых аспектов.
Наиболее очевидная причина в том, что ваша функция выполняет две разные задачи:
- Поиск на
Person
основе их имени. Это требует интеграционного тестирования, чтобы убедиться, что он может найти Person
объекты, которые предположительно созданы / хранятся в другом месте.
- Рассчитать,
Person
достаточно ли стар, исходя из их пола. Это требует модульного тестирования, чтобы убедиться, что расчет выполняется должным образом.
Сгруппировав эти задачи в один блок кода, вы не сможете выполнить одно без другого. Когда вы хотите провести модульное тестирование вычислений, вы вынуждены искать Person
(из реальной базы данных или из заглушки / макета). Если вы хотите проверить, что поиск интегрируется с остальной частью системы, вы также должны выполнить расчет возраста. Что мы должны делать с этим расчетом? Должны ли мы игнорировать это или проверить? Кажется, именно это затруднительное положение вы описываете в своем вопросе.
Если мы представим альтернативу, у нас может быть сам расчет:
def is_old_enough?(person)
if person.male?
return person.age > 21
else
return person.age > 18
end
end
Поскольку это чистый расчет, нам не нужно проводить интеграционные тесты на нем.
У нас также может возникнуть желание написать задачу поиска отдельно:
def person_from_name(name = 'filip')
return Person::API.new(name)
end
Однако в этом случае функциональность настолько близка, Person::API.new
что я бы сказал, что вы должны использовать ее вместо этого (если необходимо имя по умолчанию, лучше ли его хранить в другом месте, например, в атрибуте класса?).
При написании интеграционных тестов Person::API.new
(или person_from_name
) все, что вам нужно, это заботиться о том, получите ли вы ожидаемое Person
; все возрастные расчеты выполняются в других местах, поэтому ваши интеграционные тесты могут их игнорировать.