#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. Не стесняйтесь ответить на свой вопрос и принять его. Также проблема с этим макетом, я считаю, заключается в том, что он сломается, если вы когда-нибудь измените порядок, в котором обрабатываются элементы, например, если вы когда-либо распараллелите свою обработку.