Насмешка носорога: заглушка IEnumerator <T> - PullRequest
1 голос
/ 10 августа 2011

Я занимаюсь разработкой небольшого проекта .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 голосов
/ 11 августа 2011

Если вам просто нужен IEnumerator<String>, создавать макет не нужно.Просто создайте List<String> и передайте его перечислитель:

var commandNames = new List<String> {"one", "two", "three"};
DoSomething(commandNames.GetEnumerator());
0 голосов
/ 10 августа 2011

Из того, что я вижу, вы проходите Load() огрызок mStubEnumerator. Без установки каких-либо свойств в заглушке все методы ничего не будут делать, и все свойства будут возвращать ноль.

Здесь - отличная статья Мартина Фаулера, в которой рассматриваются различия между издевательствами, заглушками и подделками.

Итак, чтобы этот тест заработал, я бы подумал использовать фальшивку:

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

Теперь я предполагаю, что тест пройдет или будет ближе к прохождению.

Однако, не видя больше кода, я не могу быть уверен, что он будет эффективно тестировать то, что вы намереваетесь достичь.

...