짧은 대답은 "아니오"입니다. 더 흥미로운 부분은 이러한 상황이 발생하는 이유 / 방법입니다.
엄격한 관행을 준수하지 않는 코드에 대해 엄격한 테스트 관행 (단위 테스트 대 통합 테스트, 조롱 등)을 준수하려고하기 때문에 혼란이 발생한다고 생각합니다.
코드가 "잘못되었다"고 말하거나 특정 관행이 다른 것보다 낫다는 것은 아닙니다. 테스트 실습에 의해 만들어진 일부 가정은이 상황에 적용되지 않을 수 있으며 코딩 실무 및 테스트 실습에서 비슷한 수준의 "엄격 성"을 사용하는 데 도움이 될 수 있습니다. 또는 적어도 균형이 맞지 않을 수 있음을 인정하기 위해 일부 측면은 적용 할 수 없거나 중복 될 수 있습니다.
가장 확실한 이유는 함수가 두 가지 다른 작업을 수행하고 있기 때문입니다.
Person
그들의 이름을 기반으로 찾고 있습니다. Person
아마도 다른 곳에서 생성 / 저장된 객체를 찾을 수 있도록 통합 테스트가 필요합니다 .
Person
성별에 따라 a 가 충분한 지 계산합니다 . 계산이 예상대로 수행되도록하려면 유닛 테스트가 필요합니다.
이러한 작업을 하나의 코드 블록으로 그룹화하면 다른 작업 없이는 실행할 수 없습니다. 계산을 단위 테스트하려면 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
. 모든 연령 기반 계산은 다른 곳에서 처리되므로 통합 테스트에서 무시할 수 있습니다.