RhinoMocks - издевательский метод, значение возвращаемого значения которого изменяется (даже при передаче одного и того же параметра) с несколькими вызовами
Я ищу, чтобы узнать, как я могу высмеять метод, который возвращает другое значение во второй раз, когда он вызывается в первый раз. Например, что-то вроде этого:
public interface IApplicationLifetime
{
int SecondsSinceStarted {get;}
}
[Test]
public void Expected_mock_behaviour()
{
IApplicationLifetime mock = MockRepository.GenerateMock<IApplicationLifetime>();
mock.Expect(m=>m.SecondsSinceStarted).Return(1).Repeat.Once();
mock.Expect(m=>m.SecondsSinceStarted).Return(2).Repeat.Once();
Assert.AreEqual(1, mock.SecondsSinceStarted);
Assert.AreEqual(2, mock.SecondsSinceStarted);
}
Есть ли что-нибудь, что делает это возможным? Помимо реализации sub для получателя, который реализует конечный автомат?
Приветствия,
Алекс
Ответы
Ответ 1
Вы можете перехватывать возвращаемые значения с помощью метода .WhenCalled
. Обратите внимание, что вам все равно нужно предоставить значение с помощью метода .Return
, однако Rhino просто проигнорирует его, если ReturnValue
изменен из вызова метода:
int invocationsCounter = 1;
const int IgnoredReturnValue = 10;
mock.Expect(m => m.SecondsSinceLifetime)
.WhenCalled(mi => mi.ReturnValue = invocationsCounter++)
.Return(IgnoredReturnValue);
Assert.That(mock.SecondsSinceLifetime, Is.EqualTo(1));
Assert.That(mock.SecondsSinceLifetime, Is.EqualTo(2));
Edit:
Копаясь немного больше, кажется, что .Repeat.Once()
делает действительно работает в этом случае и может использоваться для достижения такого же результата:
mock.Expect(m => m.SecondsSinceStarted).Return(1).Repeat.Once();
mock.Expect(m => m.SecondsSinceStarted).Return(2).Repeat.Once();
mock.Expect(m => m.SecondsSinceStarted).Return(3).Repeat.Once();
Вернется 1, 2, 3 при последовательных вызовах.
Ответ 2
Просто используйте
mock.Expect(m=>m.SecondsSinceStarted).Return(1).Repeat.Once();
mock.Expect(m=>m.SecondsSinceStarted).Return(2).Repeat.Once();
Это приведет к возврату 1
во время первого вызова и 2
во время второго вызова. По крайней мере, на RhinoMocks 3.6.0.0
Ответ 3
Является ли время определяющим фактором в том, что возвращает метод? Если это так, я попытался бы абстрагировать время прохождения, чтобы вы могли прямо контролировать его в своих тестах.
Что-то вроде интерфейса под названием ITimeProvider с членом, называемым GetElapsedTime(), а затем создайте реализацию по умолчанию, используемую во всем приложении.
Затем, когда вы тестируете, переходите к издеваемому ITimeProvider, чтобы вы контролировали то, что воспринимается вашим приложением, чтобы прошло время.