Rhino嘲笑抽象类没有模拟它的虚拟方法?

时间:2011-08-05 17:44:55

标签: c# unit-testing virtual rhino-mocks abstract

我可以执行一个虚拟方法体,它存在于使用Rhino Mocks模拟过的抽象类中吗?

要清楚,我不是要模拟虚拟方法的行为。我正在尝试/测试/虚拟方法(在模拟类上)。

这个想法是否明显滥用Rhino Mocks?

2 个答案:

答案 0 :(得分:10)

是的,这应该是绝对正确的。我不能说我已经尝试过,但如果它失败了我会感到非常惊讶。

编辑:我怀疑你想要PartialMock方法。这是一个例子:

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
    }
}

编辑:或者在我第一次尝试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...
    }
}

答案 1 :(得分:1)

您需要告诉Rhino.Mocks回调原始实现,而不是仅仅拦截调用的默认行为:

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

现在,您可以在Foo()对象上调用mock方法。