2009-07-10 1 views
0

다음과 같은 내용이 있습니다.RhinoMocks : IList <T> 스텁은 스터브 된 후 목록에 항목을 추가하지 않습니다.

var someList = MockRepository.GenerateStub<IList<ISomething>>(); 
someList.Add(MockRepository.GenerateStub<ISomething>()); 

목록이 올바르게 프록시로 만들어집니다. 그러나 목록에 항목을 추가하려고 할 때마다 항목이 목록에 추가되지 않습니다.

프록시 클래스에 추가 구현이 없기 때문에 나는 느낌이 있습니다.하지만 대신이 상황을 해결하는 방법을 궁금 해서요 :

var someList = new List<ISomething>(); 
someList.Add(MockRepository.GenerateStub<ISomething>()); 

왜 내가하고 싶습니다. 이? 내 자신의 특수한 종류의 목록이 있다고 가정 해 봅시다. IList 인 MySpecialList를 말하지만, 단원 테스트에서 인스턴스를 생성하는 번거 로움을 겪고 싶지 않습니다. 추가 동작을 스텁하는 것이 좋습니다.

답변

2

실제로 목록이 목록으로 작동하도록하려면 어째서 스텁 지어야합니까? 그저 스텁 목록일까요? 어떤 경우 구체적인 목록을 인스턴스화하고 스텁 된 ISomething을 추가합니다.

+0

를 내 실제 시험에서 난 그냥 목록 개체를 만드는거야, 그것을 스텁 아니에요 가정 표준 컬렉션을 사용 내 질문의 맨 아래에 있지만, 나는 내 자신의 종류의 목록을 만드는 상황이 있었고 나는이 경우 어떻게 처리 될지 궁금해했다. 나는 명확하게하기 위해 나의 질문을 편집 할 것이다. – Joseph

2

당신이 정말로 추가 한 항목을 가질 필요는 없습니까? Add()가 호출 된 횟수에 대한 기대치를 설정 한 다음 Count()와 같은 값을 반환하면 예상 한 값을 반환 할 수 있습니까?

기본적으로 List를 조롱하고있는 것은 목록의 구현이 아닌 동작에 의존하는 클래스를 테스트하고 있다는 것을 의미합니다. 'methodBeingTested'있는지 테스트

Expect.Call(() => someList.Add(1)); 
Expect.Call(() => someList.Add(2)); 
Expect.Call(() => someList.Add(3)); 
Expect.Call(someList.Count()).Returns(3); 

methodBeingTested.Call(someList); 

mocks.VerifyAll(); 

세 값을 추가 한 다음에이 추가 된 항목리스트에 셀()을 호출한다.

0

GenerateStub 메서드는 올바르게 작동하는 속성이 있고 호출이 예상되지 않을 때 예외를 throw하지 않는 그냥 mock 개체 인 "스마트"스텁을 제공하지 않는다고 생각합니다. 여기에는 마법이 없습니다.

나는 당신이했던 것처럼 I가 가지고있는, 가지, 그들은 완벽하게 구현됩니다 :)