Это хороший способ настроить Moq для возврата определенного значения только определенное количество раз? - PullRequest
1 голос
/ 06 мая 2010

Используя NUnit и Moq, я пытаюсь обернуть некоторые тесты вокруг унаследованного кода, прежде чем делать слишком много рефакторинга. Мне нужно проверить, что метод продолжает работать до тех пор, пока не будет приказано остановиться. Вот моя идея, как это сделать:

[TestCase]
public void KeepsCallingDoSomethingUntilShouldIKeepGoingIsFalse()
{
   var dal = new Mock<IDataAccessLayer>();
   var sut = new MyService(dal.Object);
   int numberOfTimesToReturnTrue = 5;
   dal.Setup(x => x.ShouldIKeepGoing())
       .Callback(() => numberOfTimesToReturnTrue--)
       .Returns(() => numberOfTimesToReturnTrue >= 0);

   sut.Blah();

   dal.Verify(x => x.DoSomething(), Times.Exactly(5));
}

Трудно ли понять этот тест? Это действительный / чистый способ сделать это? Есть ли способ лучше? Что-то в написании теста таким образом меня беспокоит.

1 Ответ

1 голос
/ 06 мая 2010

Думаю, я бы сделал что-то вроде этого:

const int max = 5;
var callCount = 0;
_dal.Setup(x => x.ShouldIKeepGoing())
    .Returns(()=> ++callCount <= max )
    .AtMost(max+1);

Rhino Mocks имеет возможность записывать каждый ожидаемый вызов по порядку, а затем воспроизводить эту серию вызовов.

...