使用Rhino模拟抽象类的默认行为

时间:2009-03-06 23:39:36

标签: mocking rhino-mocks abstract-class behavior

我很嘲笑,所以这可能是我还没有接受的东西,但我找不到任何好的例子。

我试图断言默认情况下,从我的抽象类继承的任何类都将在构造函数中实例化一个集合。这是抽象类:

public abstract class DataCollectionWorkflow : SequentialWorkflowActivity
{
        private readonly DataSet _output = new DataSet();
        private List<DataCollectionParameter> _params = null;

        public DataCollectionWorkflow()
        {
            _params = new List<DataCollectionParameter>();   
        }

        public virtual IList<DataCollectionParameter> Parameters
        {
            get { return _params; }
            set { _params = (List<DataCollectionParameter>)value; }
        }
}

我如何用Rhino嘲笑这个?如果我执行GenerateMock<DataCollectionWorkflow>(或存根),构造函数运行并且模拟的私有字段“_params”被初始化,但模拟的“Parameters”属性只是空。

显然,生成的模拟子类正在覆盖属性实现。是否有某种方法可以将Parameters属性排除在重新实现之外?

感谢。

2 个答案:

答案 0 :(得分:5)

好的,我明白了。把我当作犀牛错综复杂的另一个牺牲品。这种事情让我想要转向一个更简单的框架,也许我会查看MoQ。

所以答案是使用PartialMocks。我曾经简单地玩过生成部分模拟,但是当我在它上面运行调试器时,我注意到属性甚至都不是null,它们抛出了奇怪的异常,所以我看起来并不那么深。我使用的是短格式AAA语法。

如果我简单地将模拟放入播放模式,则测试工作 - 属性按原样使用(因为它们应该与部分模拟一起使用)。

所以这就是答案:

[Test]
public void ShouldCreateParameterListInConstructor()
{
      var mockRepository = new MockRepository();
      var mock = mockRepository.PartialMock<DataCollectionWorkflow>();
      using ( mockRepository.Record() )
      {

      }
      using (mockRepository.Playback())
      {
           Assert.That(mock.Parameters, Is.Not.Null, "DataCollectionWorkflow base class didn't create new param collection");
      }
}

我意识到这是一个有状态的测试,但它实际上是涉及相关属性的一些行为测试的更简单的前奏,所以我希望这个案例作为先决条件。希望它可以帮到某人。

答案 1 :(得分:0)

尝试制作_params virtual