2009-06-24 2 views
0

나는 조롱하는 문제가 있습니다. 공공 방법 만 조롱 받아야한다는 것을 알고 있습니다. 하지만 public 메서드에서 private 메서드를 호출 할 때 어떻게해야합니까?이 private 메서드는 파일에서 데이터를 가져 오는 중입니까? 공공 방법의 테스트를 계속할 수 있도록이 개인적인 방법을 조롱하고 싶습니다.조롱 문제, 개인 기능을 호출하는 공용 함수

나는 테스트 작업을하기 위해이 내용을 공개 할 수는 있지만 그 이유는 사적인 이유로 비공식적이다. 또한 모든 것을 다른 클래스로 옮기고 함수를 공용으로 만들 수도 있지만, 메인 클래스의 객체에 대한 참조는 어느 쪽이든 사적이어야합니다.

저는 Rhino Mock을 사용하고 있습니다. 어떤 도움 :)

+0

다음 문제는 조롱 문제가 아닙니다. 그것이 작동하기 때문에 –

답변

0

에 대한

덕분에 파일 종속성을 당겨 생성자에서 IFileSomething 인터페이스에 전달합니다. 그런 다음 IFileSomething을 조롱하고 그것에 대한 기대치를 설정하십시오.

3

이 파일이

FileReader : IFileReader 

그런 다음 생성자에 인수로 IFileReader 전달 예컨대 클래스로 읽는 수행하는 기능을 넣어합니다. 그런 다음 그것을 조롱 할 수 있습니다

+0

나는 당신의 대답을 선정,하지만, 피드백을 환영합니다 다음과 같은 단점입니다 참조 : - 그것은 단지 하나의 기능을 사용할 수 있습니다 때 하나의 IFileReader는 개체의 수명으로 유지해야한다 - 그것은을 객체를 상태 기반으로 만듭니다. IFileReader는 함수가 호출 될 때마다 동일한 방식으로 동작하도록하기 위해 후속 함수 호출간에 재설정해야합니다. 이로 인해 추가적인 복잡성이 발생합니다. - 개체를 복사 할 수있는 방법이 없으면 한 번에 하나의 IFileReader 만 사용할 수 있다는 제한도 있습니다. – CiscoIPPhone

+0

맞아요.하지만 파일을 읽는 것은 저장소에서 가져 오는 것과 같아서 기능이 분리되어야한다고 생각합니다. 아마도 윈저와 같은 의존성 주입을 사용한다면, 그들은 일종의 캐싱을 내장했을 것입니다. 나는 정말로 확실하지 않습니다. –

+0

답해 주셔서 감사합니다! 나는 그것이 작동하는 것을 본다. 그러나 나는 Cisco IPPhone이 언급하는 단점들 때문에 생성자에 대한 주장으로 그것을 가지지 않기를 바랄 것이다. 개인적인 방법으로 외부 데이터에 사용하는 모든 개체에 대해이 작업을 수행해야합니다. 다른 개인 메서드에 대해서는 좀 더 필요합니다. 공용 메서드에서 개인 메서드 호출을 조롱해야 할 때 사람들은 일반적으로 무엇을합니까? –

0

다른 제안에 대한 대안은 템플릿을 템플릿으로 만들고 클래스의 메서드에서 사용할 수있는 FileReader 형식을받는 것입니다.

template <class FileReader> 
class SomeClass 
{ 
    private: void doSomething() 
    { 
    FileReader fileReader; 
    // Do something 
    } 
}; 

또 다른 방법은 FileReader의 구현을 반환하는 SomeClass 생성자에 메서드를 전달하는 것입니다. 템플릿을 사용하는 것과 비슷한 방식으로 클래스 전체에서 사용할 수 있지만, 이렇게하면 IFileReader에서 MockFileReader를 파생시킵니다.

SomeClass에서 액세스 할 수 없으므로 FileReader에서 단위 테스트를 수행 할 수 없다는 문제가 있습니다.

n.b. 위의 코드는 C++이지만 두 방법 모두 C#으로 수행 할 수 있다는 것을 알고 있습니다.

0

서비스 또는 사업체라는 사실에 동의하는지 확인하십시오.

서비스는 일반적으로 비즈니스 엔티티 집합을 사용하여 일부 작업을 완료하고 자체적으로 내구성 데이터를 유지하지 않는다는 점에서 인식됩니다.

비즈니스 엔티티는 문제가있는 도메인의 단위로, 개념적으로 유지하고자하는 것입니다.

서비스 인 경우 서비스 구성시 종속성을 주입해야합니다. 공공이면 MyService (IFileObject)

주에서 건설

: VAR 서비스 = 새로운이면 MyService (MyRealFile)

테스트 설정으로 구성

: VAR 서비스 = 새로운이면 MyService 일반적으로는이 같은 생성자를 가질 수있다 (MyMockedFiled)

테스트중인 항목이 실제로 비즈니스 엔터티라는 것을 알게되면 엔터티에 종속성을 부여하지 않아야합니다. 일반적으로 한 단계 뒤로하고 자신과 비즈니스 엔터티간에 Service 클래스를 구성합니다.이 서비스는 명시 적으로 비즈니스 엔티티에 필요한 모든 데이터를 전달합니다. 귀하의 경우, 이것은 서비스가 파일을 읽음으로써 배우기로되어있는 것을 무엇이든 제공한다는 것을 의미합니다.

따라서 서비스는 파일 시스템에 대한 종속성을 가지며 다른 (전용) 파일 판독기 비즈니스 엔티티를 사용하여 파일을 읽을 수도 있습니다. 시스템에서 다른 곳에서 사용하는 경우 사업체가 불량 종속 호출을하는 것을 결코 원하지 않습니다. 그들의 코드는 컨텍스트 바운드가됩니다. 이것은 당신이 피하고 싶은 것입니다. 비즈니스 관계는 빠르며, 분리되고, 정의되고 반응 적이어야합니다.

단위 테스트는 서비스에 의존해야하며, 주입에 의한 의존성이있을 수 있습니다. 당신이 사업체를 단위 테스트하고 있다는 것을 알게된다면, 당신은 서비스 수준이 부족합니다.

0

답해 주셔서 감사합니다. 쿠키가 삭제되었습니다. 첫 번째 대답을 사용하고 코드에서 조금 바뀌 었습니다. 잘 작동합니다 :)

관련 문제