【问题标题】:Rhino Mocks: Stubbing an IEnumerator<T>Rhino Mocks:存根 IEnumerator<T>
【发布时间】:2011-08-10 12:23:41
【问题描述】:

我正在开发一个小的 .net 2.0 项目。我到了需要测试一些采用 IEnumerator 的类的方法的地步。几天前我学会了使用 Rhino Mocks 我写了以下测试

[Test]
public void GetEnumerator_ValidList_ReverseIteration()
{
    MockRepository mMocks = new MockRepository();
    IEnumerator<string> mStubEnumerator = mMocks.Stub<IEnumerator<string>>();
    IProcessCommandFactory mStubFactory = mMocks.Stub<IProcessCommandFactory>();

    using (mMocks.Record())
    {

        mStubEnumerator.MoveNext();
        LastCall.Return(true);

        Expect.Call(mStubEnumerator.Current);
        LastCall.Return("Organization");

        mStubEnumerator.MoveNext();
        LastCall.Return(true);

        Expect.Call(mStubEnumerator.Current);
        LastCall.Return("Algorithm");

        mStubEnumerator.MoveNext();
        LastCall.Return(true);

        Expect.Call(mStubEnumerator.Current);
        LastCall.Return("ProcessTemplate");

        mStubEnumerator.MoveNext();
        LastCall.Return(false);

    }

    DeleteStrategy mStrategy= new DeleteStrategy(   mStubFactory,
                                                        "S1",
                                                        true);
    mStrategy.Load(mStubEnumerator);

    ... meaningless code...

}

这是方法代码

public void Load(IEnumerator<string> pProcessCommmandNames)
{
    while (pProcessCommmandNames.MoveNext())
    {
        string bCommandName= pProcessCommmandNames.Current;

        ... doing something with the string...
    }
}

当我尝试运行时,它不会停止,因为它只使用第一个 MoveNext() 注入值并开始一个循环。

如果有人能指出我做错了什么,我将不胜感激?

谢谢

【问题讨论】:

  • 你想测试什么?只是调用了 MoveNext 方法?似乎“...无意义的代码...”是此方法的重要部分,这就是您要为其编写单元测试的内容。
  • 对不起,我赶时间,正如你所说,我走了一条重要的线。然而它几乎一样。我的方法从枚举器中获取一个字符串并使用它来实例化一个类,但似乎我无法为 IEnumerator 存根我想要的迭代行为

标签: c#-2.0 rhino-mocks ienumerator


【解决方案1】:

据我所见,您正在传递 Load() 存根 mStubEnumerator。如果不设置存根上的任何属性,所有方法都将什么都不做,所有属性都将返回 null。

Here 是 Martin Fowler 撰写的一篇很棒的文章,回顾了 Mocks、Stubs 和 Fakes 之间的区别。

所以为了让这个测试有效,我会考虑使用假的:

MockRepository mMocks = new MockRepository();
IEnumerator<string> mFakeEnumerator = new List<string>();
mFakeEnumerator.Add("Organization");
mFakeEnumerator.Add("Algorithm");
mFakeEnumerator.Add("ProcessTemplate");
IProcessCommandFactory mStubFactory = mMocks.Stub<IProcessCommandFactory>();
...

现在我猜测测试会通过,或者会更接近通过。

但是,如果没有看到更多代码,我无法确定它是否会有效地测试您打算实现的目标。

【讨论】:

    【解决方案2】:

    如果您只需要IEnumerator&lt;String&gt;,则无需创建模拟。只需创建一个List&lt;String&gt; 并传入它的枚举数:

    var commandNames = new List<String> {"one", "two", "three"};
    DoSomething(commandNames.GetEnumerator());
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2010-10-21
      • 2011-10-23
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多