2010-02-08 4 views
3

매우 간단한 테스트를 위해 RhinoMocks를 사용합니다 (저는 여기에 초보자입니다).RhinoMocks 모의에서 메소드의 실행을 무시할 수 있습니까?

var stubLinkedObject = MockRepository.GenerateStub<MyClass>(); 

다음 내 스텁 인수 방법 클래스 MyClassAddLink를 호출 할 몇 가지 논리를 실행합니다 나는 도우미 스텁을 만들이

var mock = MockRepository.GenerateMock<MyClass>(); 

처럼 내 개체를 조롱했습니다. 테스트가 끝날 때 나는이 메소드가 실제로 호출 된 것이라고 단언한다.

mockAction.AssertWasCalled(a => a.AddLink(stubLinkedObject)); 

올바른 의존성을 주입했고 실제로 메소드가 호출되었다. 그러나 문제는 구현이 MyClass에 호출되어 일부 논리가 실행될 수 없기 때문에 충돌이 발생한다는 것입니다 (링크 모음을 사용할 수없는 등). 실행을 건너 뛰고 메소드 호출 여부를 단순히 확인하는 방법은 무엇입니까? 내가 실행에 들어가기 전에

mockAction.Stub(a => a.AddLink(null)).IgnoreArguments().Do(null); 

등을 시도했지만, 작동하지 않는 것 같습니다. (나는 단지 몇 가지 예외가 있습니다). 어떤 아이디어와 아마도 mock이 메소드 논리를 전혀 실행하지 않는 이유에 대한 설명일까요?

+1

AddLink 가상 메소드가 가상입니까? –

+0

아니, 아마도 그게 문제 야 :) –

+1

혼란스러워. 일반적으로 조롱되거나 스터브되지 않는 테스트중인 클래스의 객체 인스턴스가 하나 있어야합니다. 당신은 가짜와 스텁이있는 것 같습니다. 조롱과 스터 빙은 테스트 중에 제어해야하는 공동 작업자 객체에만 적용됩니다. –

답변

4

나는 재현하려고 시도했다. 여기 그렇지 않으면 닷넷 런타임은 항상 실제 구현 (바르게 그래서)를 실행합니다, 당신의 방법 AddLink 가상 경우에만 작동합니다 나를

[Test] 
public void Test() 
{ 
    var classMock = MockRepository.GenerateMock<MyClass>(); 
    var linkedMock = MockRepository.GenerateStub<MyClass>(); 

    classMock.Expect(c => c.MyMethod(linkedMock)); 

    classMock.MyMethod(linkedMock); 

    classMock.AssertWasCalled(c => c.MyMethod(linkedMock)); 
} 

public class MyClass 
{ 
    public virtual void MyMethod(MyClass linkedClass) 
    { 
     Console.WriteLine("MyMethod is called"); 
    } 
} 
+0

아마도 그렇게 할 수 있습니다. 감사합니다;) –

+1

질문과 마찬가지로이 대답은 나를 혼란스럽게합니다. 당신은'AssertWasCalled' (arrange-act-assert의 assert 단계에서 사용됨)와'Expect' (record-play-verify의 레코드 단계에 사용됨)를 혼합합니다. 같은 테스트에서 두 방법을 혼합해서는 안됩니다. –

+1

Rhino Mocks 3.5를 사용하여 조롱하는 새로운 모드입니다. MockRepository.GenerateMock() 및 MockRepository.GenerateStub()에서 반환 된 모의/스텁은 재생 모드에서 반환되며 재생 모드로의 명시적인 이동이 필요하지 않습니다. 여기보세요 http://www.ayende.com/Wiki/Rhino+Mocks+3.5.ashx#MockRepository –

3

당신의 접근 방식에 대해 잘 작동 코드입니다.

보통 가장 좋은 방법은 종속성 삽입을 수행 할 때 인터페이스를 사용하는 것입니다 (따라서 클래스는 MyClass 대신 IMyClass를 예상합니다). 이렇게하면 조롱 프레임 워크를 사용하는 것이 훨씬 쉬워집니다. 모든 메서드를 가상으로 만드는 것을 기억할 필요가 없으며 올바른 인수를 MyClass의 생성자에 전달하는 문제를 피할 수 있습니다 (실제 상황에서는 고통입니다)

관련 문제