2010-01-20 7 views
7

나는 TDD에 대해 상당히 익숙하지만 mock, 스텁, 의존성 주입, 제어의 반전을 사용하여 '유사한'문제를 해결하는 방법을 충분히 이해하고 있지만 ... 어떤 이유로 인해 의존성 주입과 'IThread'(또는 이와 유사한) 전달.스레드를 생성하는 메서드를 단위 테스트하는 방법?

몇 가지 기본 컨텍스트를 제공하려면 - 레거시 응용 프로그램에 단위 테스트를 추가하려고하는데 생성자가 두 개의 스레드를 생성하는 클래스를 단위 테스트하는 방법을 잘 모릅니다.

의존성 주입을 사용하는 유일한 방법은 무엇입니까?

그렇다면 스레드가 가져 오는 기능은 어떻습니까? 스레드가 실행되는 동안 스레드는 실행되는 동안 (true) 루프를 실행하고 루프를 종료하지 않습니다 (응용 프로그램이 종료되지 않는 한). 루프 안에는 합리적인 코드 덩어리가 있으며이 코드는 실제로 테스트를 받고 싶습니다.

내가 정말이 감소하므로 (내 테스트를 다른 프로젝트에 존재하는 난 단지 공공 방법을 테스트하고 있습니다) 루프에서 벗어나 공공 방법으로 모든 기능을 끌어 싶지 않아 설상가상 코드의 다른 곳에서 클래스를 쉽게 사용할 수 있습니다.

제안 사항?

답변

5

방법으로 기능을 가져오고 대신 InternalsVisibleTo을 사용할 수 있습니까? 비록 그들이 정말로 개인적으로되기를 원한다고하더라도 이것은 합리적인 절충 해결책입니다.

매우 어려운 테스트 할 수 있도록 않습니다

당신의 스레드가 정상적으로 영원히 실행한다면, ... 그리고 을 따라 그렇지 않은 경우 당신이 정말로, 별도로 "스레드가 무엇을"부분을 테스트해야처럼 소리 별도의 스레드에있다.

때때로 유용 할 수있는 옵션 중 하나는 IScheduler 유형의 인터페이스를 사용하는 것입니다.이 인터페이스가 적합하다고 판단되는 곳에서 실행되도록 요청하십시오. 프로덕션은 새로운 스레드를 만들지 만 테스트는 기존 스레드 (또는 테스트 코드 내에서 제어 할 수있는 스레드) 내에서 작업을 실행할 수 있습니다. 스레드가 영원히 돌아갈 수있는 여기 상황에 맞지 않겠지 만 다른 상황에서도 생각할 수 있습니다.

+0

내가 테스트하고있는 클래스가 클래스 라이브러리에 있고 외부에서만 사용되었으므로 합리적인 절충안입니다. 이것은 정말 잘 될 것입니다, 고마워요! – InvertedAcceleration

관련 문제