Rhino Mocks:对IEnumerator进行存根<t> </t>

时间:2011-08-10 12:23:41

标签: c#-2.0 rhino-mocks ienumerator

我正在开发一个小的.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()注入的值并开始循环。

如果有人能把我弄错了,我会很感激吗?

由于

2 个答案:

答案 0 :(得分:0)

从我所看到的你传递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>();
...

现在我猜测测试将通过,或者它将更接近传递。

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

答案 1 :(得分:0)

如果您只需要IEnumerator<String>,则无需创建模拟。只需创建一个List<String>并传入它的枚举器:

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