1

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

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

谢谢

4

2 回答 2

0

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

是 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>();
...

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

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

于 2011-08-10T14:00:12.900 回答
0

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

var commandNames = new List<String> {"one", "two", "three"};
DoSomething(commandNames.GetEnumerator());
于 2011-08-10T23:33:40.180 回答