Rhino模拟一个抽象类,而不模拟它的虚拟方法

本文关键字:模拟 虚拟 方法 抽象类 一个 Rhino | 更新日期: 2023-09-27 18:04:51

我可以执行一个虚拟方法的身体,生活在一个抽象类已经使用Rhino mock模拟?

需要说明的是,我并不是在模仿虚方法的行为。我正在尝试/测试/虚拟方法(在模拟类上)。

这个想法是公然滥用Rhino mock吗?

Rhino模拟一个抽象类,而不模拟它的虚拟方法

是的,这应该是绝对好的。我不敢说我试过,但如果失败了,我会很惊讶的。

编辑:我怀疑你想要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...
    }
}

你需要告诉Rhino。模拟回调到原始实现,而不是执行其默认行为,即只拦截调用:

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

现在你可以在你的mock对象上调用Foo()方法