Как установить ожидание каждого элемента в rhino mocks 3.6

#c# #.net #rhino-mocks-3.5

#c# #.net #rhino-mocks-3.5

Вопрос:

Я хочу иметь возможность делать что-то вроде этого:

IProcessDetails detailprocessor = Макет хранилища.GenerateMock(); обработчик деталей.Ожидать(p => p.Process(null)) .Повторите.ForEachItemIn(подробности);

Вот код, который я хочу протестировать

 public class Detail
{

}

public class Master
{
    public Master(IEnumerable<Detail> details)
    {
        Details = details;
    }

    public IEnumerable<Detail> Details { get; private set; }
}

public interface IProcessDetails
{
    void Process(Detail detail);
}

public interface IProcessMasters
{
    void Process(Master master);
}

public class MasterProcessor :
    IProcessMasters
{
    public MasterProcessor(IProcessDetails detailProcessor)
    {
        DetailProcessor = detailProcessor;
    }

    IProcessDetails DetailProcessor;

    #region IProcessMasters Members

    public void Process(Master master)
    {
        foreach (var detail in master.Details)
        {
            DetailProcessor.Process(detail);
        }
    }

    #endregion
}
  

Я хочу убедиться, что каждая деталь обрабатывается, но только один раз, и я не уверен, как это сделать

Вот мой текущий тест:

     public void GivenAMasterWithDetailsWhenProcessedThenAllDetailsAreProcessed()
    {
        IEnumerable<Detail> details = new List<Detail>()
        {
            new Detail(),
            new Detail()
        };

        Master master = new Master(
            details);

        IProcessDetails detailprocessor = MockRepository.GenerateMock<IProcessDetails>();
        //what I want or something similar
        //detailprocessor.Expect(p => p.Process(null))
        //    .Repeat.ForEachItemIn(details);

        //what it appears I can do
        detailprocessor.Expect(p => p.Process(null))
            .Constraints(List.OneOf(details))
            .Repeat.Times(details.Count());

        IProcessMasters masterprocessor = new MasterProcessor(
            detailprocessor);

        masterprocessor.Process(master);

        detailprocessor.VerifyAllExpectations();
    }
  

РЕШАЕМАЯ — я понял это:

Что мне было нужно, так это лучшее понимание rhino mocks. Использование строгого макета и простого цикла foreach решило проблему

вот мой тест сейчас:

     public void GivenAMasterWithDetailsWhenProcessedThenAllDetailsAreProcessed()
    {
        IEnumerable<Detail> details = new List<Detail>()
    {
        new Detail(),
        new Detail()
    };

        Master master = new Master(
            details);

        IProcessDetails detailprocessor = MockRepository.GenerateStrictMock<IProcessDetails>();

        foreach (var detail in details)
        {
            detailprocessor.Expect(p => p.Process(detail))
                .Repeat.Once();
        }

        IProcessMasters masterprocessor = new MasterProcessor(
            detailprocessor);

        masterprocessor.Process(master);

        detailprocessor.VerifyAllExpectations();
    }
  

Комментарии:

1. Нет ли вывода, который вы можете проверить? Пример: Если я передам последовательность объектов со значениями 1, 10 и 100 в арифмометр, я могу проверить, что результат равен 111?

2. Я мог бы, но я фанат проверки поведения вместо состояния, и это немного пуристский вопрос. Я написал модульные тесты без rhino mocks, но я собираюсь мигрировать, и эта ситуация меня заела

3. Не стесняйтесь ответить на свой вопрос и принять его. Также проблема с этим макетом, я считаю, заключается в том, что он сломается, если вы когда-нибудь измените порядок, в котором обрабатываются элементы, например, если вы когда-либо распараллелите свою обработку.