2014-10-16 2 views
0

다음과 같은 문제가 있습니다. 정말 잘못 디자인 된 API를 사용하고 있습니다. 옵션이 아님) 그리고 몇 가지 테스트를 작성하고 싶지만 클래스의 인스턴스에 의존합니다.이 클래스는 개인 생성자가있는 A이라고합시다.수정할 수없는 클래스의 개인 생성자를 사용하여 객체를 모의합니다.

내가 그 A을 조롱해야한다. 나는 원래의 행동에 전혀 신경 쓰지 않는다. 문제는 내가 원래의 클래스를 바꿀 수 없다는 것이다.

내 대안은 무엇입니까? 정적으로 타입이 지정되지 않은 루비가 나오기 때문에이 방법이 없다고 생각합니다. 그래서이 문제를 어떻게 해결할 지 잘 모릅니다.

그것은 내가 그것을 싱글 아니라 클래스에 대한 개인 생성자가 처음이 아니다 (아마도 그것은 내부의 개인 아니지만, 어떤 경우에 나는 그것에 접근이없는)

+1

'A'는 변경할 수 없지만 'A'를 사용하는 코드는 바꿀 수 있습니까? 그렇다면, 그 안에있는 참조를'A'로 바꿀 수 있습니다. 어댑터는 노출 된 인터페이스를 가진 중개자입니다. –

+0

이것은 유효한 제안입니다. 그러나 이것에 관해 나쁜 점이 하나 있습니다 : A는 80 가지 방법을 가지고 있습니다. 몇 가지 방법을 모의해볼 수 있다고 생각합니다.하지만 80 가지 방법 모두를 모의하는 것은 정말 지루할 것입니다. 나는 그것에 대해 아무 것도 할 수 없다고 생각한다. 나쁘게 설계된 API이다. –

답변

1

I을 레거시 코드로이 문제가 발생하여 고전적인 닭고기 및 달걀 문제가 발생했습니다. 테스트가 없으면 코드를 변경할 수 없지만 코드를 변경하지 않고 테스트를 작성할 수는 없습니다.

Microsoft Fakes을 사용하여 탈출구를 찾았습니다. 개인용 생성자를 포함한 거의 모든 것을 조롱 할 수 있습니다. 불행히도 Visual Studio의 Premium 및 Ultimate 에디션 (Professional이 아님)에만 포함되어 있습니다. 당신이 그걸 가지고 있지 않다면, 모든 것이 손실되지 않습니다 - Moles, 결국 Fakes를 산란시킨 연구 프로젝트는 여전히 무료 다운로드로 이용 가능하며 거의 동일하게 작동합니다.

가짜/두더지를 사용하여 테스트를 작성하고 코드를 안정적으로 변경할 수 있다면 가장 좋은 방법은 가짜/두더지 만 사용하는 경우에만이 새로운 기능을 사용하여 API를 더 쉽게 테스트 할 수 있다는 것입니다. 상당히 느리고 테스트 프로세스에 오버 헤드가 추가됩니다.

+0

고마워, 이건 정말 대단한 일이야. 어쨌든 최선의 접근 방식이'A'를 둘러싼 큰 래퍼라면, 아마 그렇습니다.하지만 Moles와 Microsoft Fakes로 시작하는 것은 좋은 생각처럼 보입니다. –

관련 문제