2009-07-14 3 views
2

내 테스트에서 일부 매개 변수와 함께 특정 dal 메서드가 호출되었다고 주장하려고합니다. 이 메서드는 DataSet 개체를 반환하므로 호출시 내 모의 수기는 그냥 DataSet 빈을 반환합니다.코뿔소에서 스텁과 mock을 섞기

SUT가 적절한 매개 변수를 사용하여 dal을 호출하지 않을 때 모의 객체가 DataSet 빈을 반환하지 않으므로 내 클래스가 null 참조에 액세스하려고 시도 할 때 예외를 throw합니다. 이는 테스트 러너에서 관련없는 메시지로 테스트가 실패하게 만듭니다.

모든 경우에 빈 Dataset을 반환하는 메서드를 스텁하고 싶습니다. 따라서 메서드가 제대로 실행되고 테스트가 끝날 때 예상 된 매개 변수와 함께 호출되었는지 확인하십시오. 내가 너무 많이 묻는거야?

답변

2

메서드에 int 인수가 있다고 가정하면이 작업을 수행해야합니다.

IDal dalMock = MockRepository.GenerateMock<IDal>(); 

// setup mock to return the emptyDataSet for any argument  
dalMock 
    .Stub(x => x.GetDataSet(Arg<int>.Is.Anything)) 
    .Return(emptyDataSet) 
    .Repeat.Any(); 

sut.Execute() 

// assert that the argument had been 7 
dalMock.AssertWasCalled(x => x.GetDataSet(Arg<int>.Is.Equal(7)) 

Documentation of argument constraints.

는 (나는이 장을 썼다, 그래서 당신이 이런 식으로 뭔가 보일 것 .NET 2.0을 사용하여 ;-)


을 이해하지 않는 경우에 당신은 저를 요청할 수 있습니다 :

MockRepository mocks = new MockRepository(); 
IDal dalMock = mocks.CreateDynamicMock<IDal>(); 

// expect the correct argument 
Expect.Call(dalMock.GetDataSet(Arg<int>.Is.Equal(7))) 
    .Return(emptyDataSet) 
    .Repeat.Once(); 

// setup mock to return the emptyDataSet for any argument  
SetupResult.For(dalMock.GetDataSet(Arg<int>.Is.Anything)) 
    .Return(emptyDataSet) 
    .Repeat.Any(); 

sut.Execute() 

// assert that the argument had been 7 
mocks.VerifyAll(); 

작동하는 경우 100 % 확신 할 수는 없지만해야합니다.

당신이 시도 할 수 있습니다 : 모의가 호출 될 때

// setup mock to return the emptyDataSet for any argument  
SetupResult.For(dalMock.GetDataSet(Arg<int>.Is.Anything)) 
    .Do((GetDataSetDelegate)delegate(int i) 
    { 
     Assert.AreEqual(7, i); 
    } 
    .Return(emptyDataSet) 
    .Repeat.Any(); 

sut.Execute() 

Do이 실행됩니다. 조롱 된 메서드와 완전히 동일한 인터페이스를 가진 대리자가 필요합니다. .NET 2.0의 구문상의 이유 때문에 올바른 대리자 형식으로 캐스팅해야하므로 먼저 선언해야합니다 (이 경우 GetDataSetDelegate).

Rhino 3.5 사용자를위한 참고 사항 : 더 편리하게 호출 할 수있는 방법이 있습니다. WhenCalled은 인수로 람다를 사용하지만 다르게 구현해야합니다.

각각 Do 또는 WhenCalled으로 모의이 호출되면 인수 어설 션을 구현할 수 있습니다.

+0

팁과 링크를 가져 주셔서 감사합니다. 그래서 나는 논쟁으로 기대를 설정하고 "그 밖의 모든 것"을 가진 스텁을 사용하여 그것을 할 수있는 방법이 없습니까? VS2005에서 .NET 2.0을 사용하기 때문에 람다 및 확장 메서드를 사용할 수 없기 때문에 사용법을 최소화해야합니다. –

+0

이전 구문을 사용할 수 있습니다. 나는 대답에 그것을 추가하려고합니다. –

+0

현재 나는 AAA 구문을 사용하고 있습니다. 방금 사용했습니다 RhinoMocksExtensions.Stub (dal, delegate .Is.Anything); }).반환 (새 DataSet()); 그러나 저는 dal이 항상 메소드를 스텁으로 만들고, 여러분이 제안한 것처럼 "AssertWasCalled"로 기대를 추가 할 것이라고 생각합니다. 다시 한번 감사드립니다. –

-2

here과 같이 Rhino Mocks가있는 부분 조롱을 사용 해본 적이 있습니까? 나는 당신이 그렇게하면 당신이 원하는 것을 얻을 것이라고 생각합니다.

+0

부분 모의 (partial mocks)를 사용하는 것은 매우 나쁜 생각입니다. 인터페이스가 없거나 사용자가 통제 할 수없는 것을 조롱 할 필요가있을 때만 사용해야합니다. –

+0

나는 좋은 생각이라고 결코 말하지 않았다. 그가 가진 문제에 대한 아이디어였습니다. 그래서 당신의 더 나은 생각은 무엇입니까? – AutomatedTester