2010-08-09 2 views
2

Я пытаюсь проверить, правильно ли метод, который я хочу проверить, вызывает какой-то внешний (mock) объект.Rhino.Mocks, как тестировать вызовы метода абстрактного класса

Вот пример кода:

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 линии, прежде чем любой вызов сделан.

Как подойти к этому - например, как проверить, правильно ли проверенный метод переадресовывает вызов? не

Это проект .NET 2.0 (я могу не изменить это сейчас), так что не «х =>» синтаксис :(

ответ

2

Я должен признать, что я не совсем уверен, что здесь происходит, но с использованием Rhino.Mocks 3.6 и более новый синтаксис, он отлично работает для меня:

[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); 
    } 
} 

он не имеет ничего общего с версией Rhino.Mocks со старым синтаксисом, я получаю ту же ошибку, как. я не заметил никаких очевидных ошибок в вашем коде, но опять же, я привык к этому синтаксису using.

Редактировать: удалено ключевое слово var, так как вы используете .NET 2.0.

+0

Странно ... Я попробовал почти ваш подход, просто вместо того, чтобы использовать собственный MockRepository, я использовал статический GenerateStrictMock <>, а затем в операциях using, которые я использовал mock.GetMockRepository(). Record/Replay и он терпит неудачу с «Rhino.Mocks.Exceptions.ExpectationViolationException: BaseWorker.DoWork (« SomeData »),« Ожидаемый № 0 »,« Фактический номер 1 ».». Ваш подход работает ... но меня еще больше смущает ... в любом случае ... это работает, спасибо. –

Смежные вопросы