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

だけが必要な場合はIEnumerator<String>、モックを作成する必要はありません。を作成し、List<String>その列挙子を渡すだけです。

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

私が見ているところから、あなたはLoad()stub を渡していますmStubEnumerator。スタブにプロパティを設定しないと、すべてのメソッドが何もせず、すべてのプロパティが null を返します。

これは、 Mock、Stub、Fake の違いをレビューしている Martin Fowler による素晴らしい記事です。

したがって、このテストを機能させるには、偽物を使用することを検討します。

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 に答える