关于c#:Rhino模拟一个抽象类没有模拟它的虚方法?

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

我能执行一个虚拟方法的主体吗?这个虚拟方法存在于一个抽象类中,而这个抽象类是使用Rhino Mocks模拟的?

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

这是明目张胆地滥用犀牛模型吗?


是的,那应该很好。我不能说我试过了,但如果失败了我会很惊讶的。

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

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
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时:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
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.Mocks回拨原始实现,而不是执行其默认行为,即只截取调用:

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

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