2010-08-09 4 views
2

테스트 할 메소드가 외부 (가짜) 객체를 제대로 호출하는지 테스트하려고합니다. 나는이 테스트를 실행하면Rhino. 추상 클래스 메소드 호출을 테스트하는 방법을 모의합니다.

using System; 

using Rhino.Mocks; 

using NUnit.Framework; 

namespace RhinoTests 
{ 
    public abstract class BaseWorker 
    { 
     public abstract int DoWork(string data); 
    } 

    public class MyClass 
    { 
     private BaseWorker worker; 
     public BaseWorker Worker 
     { 
      get { return this.worker; } 
     } 

     public MyClass(BaseWorker worker) 
     { 
      this.worker = worker; 
     } 

     public int MethodToTest(string data) 
     { 
      return this.Worker.DoWork(data); 
     } 
    } 

    [TestFixture] 
    public class RhinoTest 
    { 
     [Test] 
     public void TestMyMethod() 
     { 
      BaseWorker mock = MockRepository.GenerateMock<BaseWorker>(); 
      MyClass myClass = new MyClass(mock); 

      string testData = "SomeData"; 
      int expResponse = 10; 

      //I want to verify, that the method forwards the input to the worker 
      //and returns the result of the call 

      Expect.Call(mock.DoWork(testData)).Return(expResponse); 
      mock.GetMockRepository().ReplayAll(); 

      int realResp = myClass.MethodToTest(testData); 

      Assert.AreEqual(expResponse, realResp); 
     } 
    } 
} 

, 내가 얻을 : 모든 호출이 이루어지기 전에

TestCase 'RhinoTests.RhinoTest.TestMyMethod' 
failed: System.InvalidOperationException : Invalid call, the last call has been used or no call has been made (make sure that you are calling a virtual (C#)/Overridable (VB) method). 
    at Rhino.Mocks.LastCall.GetOptions[T]() 
    at Rhino.Mocks.Expect.Call[T](T ignored) 
    RhinoTest.cs(48,0): at RhinoTests.RhinoTest.TestMyMethod() 

예외가의 Expect.Call 라인에 발생합니다 여기

는 샘플 코드입니다.

어떻게 접근합니까? 즉, 테스트중인 메소드가 통화를 올바르게 전달하는지 확인하는 방법은 무엇입니까?

이 닷넷 2.0 프로젝트 (I 할 수있는 지금은 변화 없음이), 그래서 "X =>"구문 :(내가 인정해야

답변

2

, 나는 여기에 무슨 일이 일어나고 있는지 전혀 모르겠어요,하지 하지만 Rhino.Mocks 3.6과 새로운 구문을 사용하는 것은, 나를 위해 잘 작동 : 그것은 Rhino.Mocks 버전과는 아무 상관이없는

[Test] 
public void TestMyMethod() 
{ 
    MockRepository mocks = new MockRepository(); 
    BaseWorker mock = mocks.StrictMock<BaseWorker>(); 

    MyClass myClass = new MyClass(mock); 
    string testData = "SomeData"; 
    int expResponse = 10; 

    using (mocks.Record()) 
    { 
     //I want to verify, that the method forwards the input to the worker 
     //and returns the result of the call 
     Expect.Call(mock.DoWork(testData)).Return(expResponse); 
    } 

    using (mocks.Playback()) 
    { 
     int realResp = myClass.MethodToTest(testData); 
     Assert.AreEqual(expResponse, realResp); 
    } 
} 

오래된 구문으로, 저도 같은 오류로 얻을. 코드에서 명백한 오류를 발견하지 못했지만이 using 구문에 익숙합니다.

을 편집하십시오 : .NET 2.0을 사용 중이므로 var 키워드가 제거되었습니다.

+0

이상한 ... 나는 자신의 접근 방식을 시도했지만, 대신 자신의 MockRepository를 사용하는 대신 정적 GenerateStrictMock <>을 사용했고, 나중에 mock.GetMockRepository()를 사용하여 구문을 사용했다. "Rhino.Mocks.Exceptions.ExpectationViolationException : BaseWorker.DoWork ("SomeData "); 예상 # 0, 실제 # 1"로 실패합니다. " 당신의 접근 방식은 작동합니다 ...하지만 나는 더 혼란 스럽습니다 ... 어쨌든 ... 작동합니다, 고마워요. –

관련 문제