我正在开发一个小的.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()注入的值并开始循环。
如果有人能把我弄错了,我会很感激吗?
由于
答案 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());