2012-01-31 1 views
0

재귀 모의 작업을 수행 할 수 없습니다.RhinoMock - 재귀 조롱

SomeClass someMOck = MockRepository.GenerateMock<SomeClass>(); 

//SomeClass is having another class as a property. 

someMock.Stub(x => x.Manager.SomeData).Return("Hello"); 

런타임 중에는 오류가 발생합니다.

System.InvalidOperationException : 이전 메서드 'SomeClass.get_Manager();' 던질 때 반환 값 또는 예외가 필요합니다.

나는 3.6 빌드 21

모든 아이디어를 사용하고?

답변

2

someeClass.Manager에 지정된 값이 없기 때문입니다.

Manager 클래스를 조롱하고 someeClass.Manager의 반환 값으로 설정해야합니다.

SomeClass someMock= MockRepository.GenerateMock<SomeClass>(); 
Manager managerMock= MockRepository.GenerateMock<Manager>(); 

managerMock.Stub(x => x.SomeData).Return("Hello"); 
someMock.Stub(x => x.Manager).Return(managerMock); 

하지만 다른 것은 코드 디자인과 관련이 있습니다. Law Of Demeter은 코드에서 중첩 된 property.property를 사용하지 않아야한다고 명시합니다. 정말로 필요한 정보 만 전달하고 전달 된 모든 정보가 사용되는지 확인해야합니다. 따라서 완전한 Manager 개체에만 액세스해야 SomeData에 액세스해야합니까?

+0

Demeter의 법칙을 이해합니다. 그러나 아이디어는 변경/리팩토링없이 테스트를 수행 할 수 있는지 확인하는 것입니다. 하지만 그 일은 내가 재귀 적 조롱을하고 싶다면 어쨌든 옳게 그루터기를 그루터기로 만들어야합니다. 나는 RhinoMock이 자동으로 그렇게 할 것이라는 인상을 받고있었습니다. – HAN

+0

하지만 스터 빙 후에도 왜이 구문이 작동하지 않을지 모르겠다. x => x.Manager.SoemData 'x.Manager'는 'System.InvalidOperationException'유형의 예외를 던졌습니다. RhinoMocks 문서에서는 새로운 재귀 조롱의 일부로이 구문을 사용할 수 있다고 말합니다. – HAN