使用Rhino Mocks对物业进行捣乱

时间:2011-08-09 18:31:25

标签: c# properties rhino-mocks stub

使用RhinoMocks,我试图Stub一个属性的getter值。该属性被定义为仅具有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");
        }
    }

2 个答案:

答案 0 :(得分:33)

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

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

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

另请注意,如果您想设置方法以某种方式行事,无论是模拟还是存根,您都会说:

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

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

如果要提供以某种方式运行的依赖项,请使用存根。如果要验证某个依赖项是否已正确交互,请使用模拟。

来自(杰出)Rhino Wiki

  

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

     

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

     

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

答案 1 :(得分:4)

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

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

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