3

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

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

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 属性排除在重新实现之外?

谢谢。

4

2 回答 2

5

好吧,我想通了。把我当作 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");
      }
}

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

于 2009-03-07T06:53:24.633 回答
0

尝试使 _params 虚拟

于 2009-03-06T23:54:52.363 回答