Rhino mock an abstract class w/o mocking its virtual method?

前端 未结 2 835
孤独总比滥情好
孤独总比滥情好 2021-01-13 00:18

Can I execute the body of a virtual method that lives on an abstract class which has been mocked using Rhino Mocks?

To be clear, I\'m not trying to mock the behavior

相关标签:
2条回答
  • 2021-01-13 00:25

    You need to tell Rhino.Mocks to call back to the original implementation instead of doing its default behavior of just intercepting the call:

    var mock = MockRepository.GenerateMock<YourClass>();
    mock.Setup(m => m.Foo()).CallOriginalMethod(OriginalCallOptions.NoExpectation);
    

    Now you can call the Foo() method on your mock object.

    0 讨论(0)
  • 2021-01-13 00:46

    Yes, that should be absolutely fine. I can't say I've tried it, but I'd be very surprised if it failed.

    EDIT: I suspect you want the PartialMock method. Here's an example:

    using System;
    using Rhino.Mocks;
    
    public abstract class Abstract
    {
        public virtual int Foo()
        {
            return Bar() * 2;
        }
    
        public abstract int Bar();        
    }
    
    class Test
    {
        static void Main(string[] args)
        {
            MockRepository repository = new MockRepository();
            Abstract mock = repository.PartialMock<Abstract>();
    
            using (repository.Record())
            {
                Expect.Call(mock.Bar()).Return(5);
            }
    
            Console.WriteLine(mock.Foo()); // Prints 10
        }
    }
    

    EDIT: Or in my first attempt at AAA:

    using System;
    using Rhino.Mocks;
    
    public abstract class Abstract
    {
        public virtual int Foo()
        {
            return Bar() * 2;
        }
    
        public abstract int Bar();        
    }
    
    class Test
    {
        static void Main(string[] args)
        {
            // Arrange
            Abstract mock = MockRepository.GeneratePartialMock<Abstract>();
            mock.Stub(action => action.Bar()).Return(5);
    
            // Act
            int result = mock.Foo();
    
            // Assert
            mock.AssertWasCalled(x => x.Bar());
            // And assert that result is 10...
        }
    }
    
    0 讨论(0)
提交回复
热议问题