2010-06-30 3 views
11

레거시 코드로 작업하고 테스트를 만들 때 클래스 또는 메소드의 종속성을 자주 깨기 때문에 이러한 종속성에 대한 mock을 사용하여 단위 테스트를 작성할 수 있습니다. 종속성은 대부분 정적 클래스 및 생성자 또는 새 클래스의 다른 위치에서 new 키워드를 사용하여 만든 객체에 대한 호출 형식으로 제공됩니다.클래스에서 모든 의존성을 제거하는 가장 간단하고 빠른 방법

대부분의 경우 정적 호출은 정적 종속성을 래핑하거나 해당 인터페이스로 종속성을 전달하는 StaticClass.Current.MethodCall() 형식의 단일 패턴 (또는 유사한)이 대신 생성자로 이동하는 방식으로 처리됩니다 .

대부분의 경우 생성자에서 new 키워드를 사용하는 대신 해당 인터페이스를 생성자에서 전달합니다.

대부분의 경우, 클래스의 다른 부분에서 new 키워드를 사용하는 것은 위와 같은 방법으로 처리되거나 필요한 경우 팩토리를 생성하고 팩토리의 인터페이스를 생성자에서 전달합니다.

항상 Resharpers 리팩토링 도구를 사용하여 이러한 모든 문제를 해결할 수 있지만 대부분의 작업은 수동 작업 (자동화 될 수 있음)과 매우 지루한 프로세스 일 수있는 일부 기존 클래스 및 방법에 대한 것입니다. 이 과정에서 나를 도울 다른 리팩토링 플러그인 및/또는 도구가 있습니까? "한 번의 클릭으로이 클래스의 모든 depencencies"리팩토링 도구가 있습니까? =)

많은 개발자와 공통적 인 문제에서 공통적으로 나타나는 것처럼 들리지만 Resharper 또는 CodeRush에 플러그인을 작성하기 전에 누군가가 이미이 문제를 시도했기 때문에 질문해야합니다.

ADDED : 아래 답변에 반영

: 당신은 모든 것을 파괴하고 싶지 않을 수도 경우에도 여전히 간단하게 탈출 할 수있는 번 (이 도움보다 더 많은 문제가 발생할 수 있습니다 한 번의 클릭 총 브레이크 아웃)에서 1 개의 메소드 종속성 또는 1-2 개의 종속성이 쉽게 다를 수 있습니다.

또한 리팩토링 코드에는 "모든 것을 함께 모으는 방법을 배우기 위해 어떤 일이 발생하는지 확인하십시오."라는 측정 값이 있습니다. 코드를 확인하지 않아도 한 번의 클릭만으로 프로세스 톤을 도울 수 있습니다.

+0

아래에 언급 된 고전적으로 효과적으로 작동하는 레거시 코드와 마찬가지로, Brownfield 응용 프로그램 개발이 .NET에서 재미있을 수도 있습니다. http://www.manning.com/baley/ – AakashM

답변

3

나는 이것을 자동화 할 수있는 도구가 없다고 생각합니다. 레거시 코드로 작업한다는 것은 한 번에 작은 단계로 코드를 변경하는 것을 의미합니다. 이 단계는 오류가 발생하지 않도록 의도적으로 작습니다. 일반적으로 첫 번째 변경 사항은 코드를 테스트 할 수있게 만드는 것입니다. 테스트를 작성한 후에는 버그 수정이나 RFC 구현과 같은 방식으로 코드 부분을 변경합니다.

작은 단계를 거쳐야하므로 리팩터링 도구를 사용하여 마술처럼 모든 종속성을 사라지게 만드는 것이 어렵다고 생각합니다. 레거시 시스템을 사용하면 단번에 큰 변화를 일으키지 않으려합니다. 단절의 위험 (테스트 부족으로 발견하지 못함)이 너무 크기 때문입니다. 그러나 이것은 리팩토링 도구가이 시나리오에서 유용하지 않다는 것을 의미하지는 않습니다. 반대로; 그들은 많은 도움이됩니다.

아직 작성하지 않았다면 Michael Feathers의 저서 Working Effectively with Legacy Code을 읽어 보시기 바랍니다. 레거시 코드를 좀 더 검증 가능한 시스템으로 리팩터링하는 데 도움이되는 일련의 패턴을 자세하게 설명합니다.

행운을 빈다.

+0

실제로 읽을 예정입니다. 그 책! 당신의 대답에는 진실이 많이 있습니다. 그래도 한 번에 모든 것을 제거하고 싶지 않을지라도 (클릭 한 번으로 누락되면 더 많은 문제가 발생할 수 있음) 여전히 1 개의 메소드 종속성 또는 1-2 개의 종속성을 쉽게 파기 할 수 있습니다. 큰 차이가있다. 또한 리팩토링 코드에는 "모든 것을 함께 사용하는 방법을 배우기 위해 어떤 일이 발생하는지 확인하십시오."라는 측정 값이 있습니다. 코드를 확인하지 않아도 한 번의 클릭만으로 프로세스 톤을 도울 수 있습니다. – MatteS

+0

그 책을 지금 읽었을 때, 나는 코드를 확인하고 싶지는 않지만 유용한 툴을 찾을 수있을 것이다. 그러나 단순히 기존 의존성에 대한 개요를 갖는 것은 매우 유용하다. 메소드마다, 클래스마다, 또는 코드를 변경하고 테스트를 작성해야하는 부분. 또한이 책을 읽으면서이 도구가 실제로 의존성을 없애기위한 선택적인 방법으로 어떻게 도움이 될지에 대한 많은 아이디어를 얻었습니다. – MatteS

+0

@MatteS : NDepend를 살펴보십시오. 이 도구를 사용하면 시스템의 각 부분 간의 종속성을 시각화 할 수 있습니다. – Steven

1

정적 호출 종속성에 관해서는 Moles을 확인해보십시오.런타임시 코드 삽입을 수행하여 자신의 테스트 구현으로 정적 또는 비 가상 메서드 호출을 스텁 (stub) 처리 할 수 ​​있습니다. 이것은 테스트 가능한 의존성 주입 인터페이스를 사용하여 설계되지 않은 레거시 코드를 테스트 할 때 유용합니다.

관련 문제