【问题标题】:Rhino mock an abstract class w/o mocking its virtual method?Rhino 模拟一个抽象类而不模拟它的虚拟方法?
【发布时间】:2023-03-15 08:18:02
【问题描述】:

我可以执行存在于已使用 Rhino Mocks 模拟的抽象类上的虚拟方法的主体吗?

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

这个想法是对 Rhino Mocks 的公然滥用吗?

【问题讨论】:

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


    【解决方案1】:

    是的,那应该没问题。我不能说我已经尝试过了,但如果它失败了,我会感到非常惊讶。

    编辑:我怀疑你想要 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 Mocks 实例化的抽象类上的虚拟方法。
    • @lance:是的,如果你一开始就这么说会很有用……我会试着重现这个问题。
    • @lance:我已经发布了一个对我有用的示例……如果你的类不是公开的或者抽象方法不是公开的,你可能会遇到一些困难。不过我敢肯定有办法解决这个问题 - 我有一段时间没有使用 Rhino。
    • 我正在使用 Rhino Mock 的 AAA 语法,但它对我来说失败了。您能否使用 AAA 语法重现成功?
    • @lance:我自己没有使用过 AAA 样式,但环顾四周,它看起来应该没问题如果您对任何摘要的存根行为感到满意您正在调用的虚拟方法调用的方法。听起来你在 AAA 方法方面的经验比我多,所以你可能处于一个更好的实验场所。
    【解决方案2】:

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

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

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

    【讨论】:

    • 静态生成mock时看不到Setup方法?
    • 嗯...您使用的是什么版本的 Rhino.Mocks?
    猜你喜欢
    • 1970-01-01
    • 2014-08-13
    • 2016-12-05
    • 1970-01-01
    • 1970-01-01
    • 2010-10-11
    • 1970-01-01
    • 2013-04-16
    • 1970-01-01
    相关资源
    最近更新 更多