Подтвердить что ты не робот

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 для получателя, который реализует конечный автомат?

Приветствия,

Алекс

4b9b3361

Ответ 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, чтобы вы контролировали то, что воспринимается вашим приложением, чтобы прошло время.