【问题标题】:Stubbing a Property get using Rhino Mocks使用 Rhino Mocks 存根属性
【发布时间】:2011-10-23 11:37:04
【问题描述】:

使用 RhinoMocks,我试图对属性的 getter 值进行 Stub。该属性被定义为仅具有 getter 访问权限的接口的一部分。

但是我收到错误“无效调用,已使用最后一次调用或未进行调用(确保您正在调用虚拟 (C#) / 可覆盖 (VB) 方法)。”我理解这可能意味着我存根的属性不是虚拟的;但是它是接口的一部分,我不确定这是否是我收到此错误的原因..

下面是代码框架。如果我取消注释“stubRepository.Stub(x => x.StoreDeviceID).PropertyBehavior();”的行,那么我会收到一个新错误“属性必须是读/写”。我在 SO 上搜索并找到 this 页面。但是建议的解决方案对我没有帮助。有什么想法吗?

public interface IStore {
        string StoreDeviceID {get;}
        //other methods
    }

    public static class Store {
        private IStore Repository;

        public void SetRepository(IStore rep){
            Repository = rep;
        }

        public StoredeviceID {
            get{
                return Repository.StoreDeviceID;
            }
        }

        //other methods
    }

    public class TestClass {
        [Test]
        public void TestDeviceID() {
            var stubRepository =
                MockRepository.GenerateStub<IStore>();
            Store.SetRepository(stubRepository);

            //stubRepository.Stub(x => x.StoreDeviceID).PropertyBehavior();
            SetupResult.For(stubRepository.StoreDeviceID).Return("test");

            Assert.AreSame(Store.StoreDeviceID, "test");
        }
    }

【问题讨论】:

    标签: c# properties rhino-mocks stub


    【解决方案1】:

    由于这是一个只读属性,你需要说:

    stubRepository.Stub(x => x.StoreDeviceID).Return("test");
    

    通常对于存根,属性的使用与普通 C# 属性一样。所以对于非只读属性,你会说:stubRepository.someProperty = "test";

    另外请注意,如果您想设置一个方法以某种方式运行,无论它是模拟还是存根,您总是会说:

    stubRepository.Stub(x => x.someMethod()).Return("foo");
    

    请记住,存根可以为您的单元测试提供所需的依赖项,但不是可以运行验证;这就是模拟的用途。

    当您想要提供以某种方式运行的依赖项时,请使用存根。当您想验证某个依赖项是否已正确交互时,请使用 Mock。

    来自(优秀的)Rhino Wiki

    模拟是一个我们可以设置期望的对象,它将 验证预期的动作确实发生了。存根是一个 您用来传递给被测代码的对象。你可以 设定对它的期望,所以它会以某些方式行动,但是那些 期望永远不会得到验证。存根的属性将 自动表现得像普通属性,你不能设置 对他们的期望。

    如果您想验证被测代码的行为,您将 使用具有适当期望的模拟,并验证这一点。如果你 只想传递一个可能需要以某种方式执行的值,但是 不是本次测试的重点,您将使用存根。

    重要提示:存根永远不会导致测试失败。

    【讨论】:

    • @Adam,由于该属性是只读的,我无法对其进行设置。但是,您提供给 Stub 该属性的代码 sn-p 可以完美运行。愚蠢的我,我尝试了所有其他选项,除了:)
    • StoreDeviceID 没有设置器,因此您的第一条语句 stubRepository.StoreDeviceID = "test"; 将不起作用。
    • 啊——对不起。我会更新我的答案 - 很高兴你让它工作了。
    • 在较新版本的 Rhino Mocks 中,mock 和 stub 之间的区别已经模糊,是吗? (除非您使用的是 strickmock 等)
    • 当我尝试此操作时,我收到错误:您正在尝试对定义为使用 PropertyBehavior 的属性设置期望。而不是编写这样的代码:mockObject.Stub(x => x.SomeProperty).Return(42);您可以直接使用该属性来达到相同的结果:mockObject.SomeProperty = 42;
    【解决方案2】:

    您可以使用存根执行以下操作:

    stubRepository.Stub(x => x.StoreDeviceID).Return("test");
    

    这将导致它为对 StoreDeviceID 的 getter 的任何调用返回“test”。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-08-28
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多