Я начал экспериментировать с Rhino-Mocks (3.6), когда читал Роя Ошерова Искусство модульного тестирования . У него есть пример, демонстрирующий, что имитирующий метод может быть написан так, чтобы возвращать разные результаты при двойном вызове с одним и тем же параметром:
[Test]
public void ReturnResultsFromMock()
{
MockRepository repository = new MockRepository();
IGetRestuls resultGetter = repository.DynamicMock();
using(repository.Record())
{
resultGetter.GetSomeNumber("a");
LastCall.Return(1);
resultGetter.GetSomeNumber("a");
LastCall.Return(2);
resultGetter.GetSomeNumber("b");
LastCall.Return(3);
}
int result = resultGetter.GetSomeNumber("b");
Assert.AreEqual(3, result);
int result2 = resultGetter.GetSomeNumber("a");
Assert.AreEqual(1, result2);
int result3 = resultGetter.GetSomeNumber("a");
Assert.AreEqual(2, result3);
}
Это прекрасно работает. Но когда я пробую то же самое с заглушкой, и метод, который принимает и возвращает строку, я не могу сгенерировать второе возвращаемое значение:
[Test]
public void StubMethodWithStringParameter_ScriptTwoResponses_SameResponseReceived()
{
MockRepository mocks = new MockRepository();
IMessageProvider stub = mocks.Stub();
using (mocks.Record())
{
stub.GetMessageForValue("a");
LastCall.Return("First call");
stub.GetMessageForValue("a");
LastCall.Return("Second call");
}
Assert.AreEqual("First call", stub.GetMessageForValue("a"));
Assert.AreEqual("Second call", stub.GetMessageForValue("a"));
}
}
public interface IMessageProvider
{
string GetMessage();
string GetMessageForValue(string value);
}
Этот тест завершился неудачно, потому что «Первый вызов» получен для обоих вызовов. Я пробовал несколько морщин синтаксиса (используя mocks.Ordered (), SetResult, Expect и т. Д.), Но мне все еще не удалось получить второй результат.
Я что-то делаю не так, или это ограничение Rhino-Mocks? Я проверил это сообщение в блоге , но предложенный синтаксис не решил мою проблему.