C# 使用Rhino Mock存根获取属性

C# 使用Rhino Mock存根获取属性,c#,properties,rhino-mocks,stub,C#,Properties,Rhino Mocks,Stub,使用Rhinomock,我试图存根属性的getter值。属性被定义为仅具有getter访问权限的接口的一部分 但是,我收到错误“无效调用,已使用最后一个调用或未进行任何调用(确保您正在调用虚拟(C#))/Overridable(VB)方法)。”我理解这可能意味着我正在存根的属性不是虚拟的;但是,它是接口的一部分,我不确定这是否是我出现此错误的原因 下面是代码框架。如果我取消注释显示“stubRepository.Stub(x=>x.StoreDeviceID).PropertyBehavior(

使用Rhinomock,我试图存根属性的getter值。属性被定义为仅具有getter访问权限的接口的一部分

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

下面是代码框架。如果我取消注释显示“stubRepository.Stub(x=>x.StoreDeviceID).PropertyBehavior();”的行,那么我会得到一个新错误“Property必须是读/写的”。我在某处搜索,找到了第页。但是提议的解决方案对我没有帮助。有什么想法吗

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");
        }
    }
公共接口晶体管{
字符串StoreDeviceID{get;}
//其他方法
}
公共静态类存储{
专用存储库;
公共存储库(IStore rep){
Repository=rep;
}
公共存储设备ID{
得到{
返回Repository.StoreDeviceID;
}
}
//其他方法
}
公共类TestClass{
[测试]
public void TestDeviceID(){
var stubRepository=
MockRepository.generateSub();
Store.SetRepository(stubRepository);
//stubRepository.Stub(x=>x.StoreDeviceID).PropertyBehavior();
SetupResult.For(stubRepository.StoreDeviceID).Return(“test”);
Assert.arame(Store.StoreDeviceID,“test”);
}
}

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

stubRepository.Stub(x => x.StoreDeviceID).Return("test");
通常对于存根,属性的使用与普通C#属性类似。因此,对于非只读属性,您可以说:
stubRepository.someProperty=“test”

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

stubRepository.Stub(x => x.someMethod()).Return("foo");
记住,存根是用来为单元测试提供它们所需的依赖项的,但不是用来运行验证的;这就是模仿的目的

当您希望提供具有特定行为方式的依赖项时,请使用存根。当您想要验证某个依赖项是否已正确地与之交互时,请使用模拟

来自(未完成的):

模拟是一个我们可以设定期望值的对象,它将 验证是否确实发生了预期的操作。存根是一个 对象,该对象用于传递给被测代码。你可以 设置对它的期望,这样它会以某些方式运行,但是 期望永远不会被证实。存根的属性将 自动表现为正常属性,并且您无法设置 对他们的期望

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

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


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

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

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

@Adam,因为该属性是只读的,所以我无法对其进行设置。但是,您为存根属性提供的代码片段可以完美地工作。愚蠢的我,我尝试了所有其他选项,除了:)StoreDeviceID没有setter,所以您的第一个语句
stubRepository.StoreDeviceID=“test”不起作用。啊-对不起。我会更新我的答案-很高兴你让它工作了。在新版本的Rhino mock中,mock和stub之间的区别已经模糊了是吗?(除非您使用的是strickmock等)当我尝试此操作时,会出现错误:您试图对定义为使用PropertyBehavior的属性设置期望。而不是编写这样的代码:mockObject.Stub(x=>x.SomeProperty).Return(42);您可以直接使用该属性来获得相同的结果:mockObject.SomeProperty=42;