【问题标题】:Mock abstract class default behaviour with Rhino使用 Rhino 模拟抽象类默认行为
【发布时间】:2009-03-06 23:39:36
【问题描述】:

我对 mock 很陌生,所以这可能是我还没有掌握的东西,但我在任何地方都找不到一个好的例子。

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

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&lt;DataCollectionWorkflow&gt;(或存根),构造函数运行并且模拟的私有字段“_params”被初始化,但模拟的“Parameters”属性只是空。

很明显,生成的模拟子类覆盖了属性实现。是否有某种方法可以排除重新实现参数属性?

谢谢。

【问题讨论】:

    标签: mocking rhino-mocks abstract-class behavior


    【解决方案1】:

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

    所以答案是使用 PartialMocks。我曾短暂地玩弄过生成一个部分模拟,但是当我在它上面运行调试器时,我注意到属性甚至不是空的,它们抛出了奇怪的异常,所以我没有深入研究。我使用的是缩写 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");
          }
    }
    

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

    【讨论】:

      【解决方案2】:

      尝试将 _params 设为虚拟

      【讨论】:

      • 字段不能是虚拟的。问题是参数属性被覆盖,而不是字段。该字段初始化得很好......它不再链接到模拟中的属性。
      猜你喜欢
      • 1970-01-01
      • 2023-03-15
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-01-04
      • 1970-01-01
      • 2012-11-03
      • 2016-12-05
      相关资源
      最近更新 更多