Могу ли я определить реализацию методов для объектов Rhino Mocked? - PullRequest
4 голосов
/ 11 мая 2011

С Rhino.Mocks, как только я макет интерфейса, я могу:

  • Установить "возвращаемые" значения для не пустых методов на смоделированном объекте
  • Проверьте, как и с какими значениями были вызваны определенные методы с

Однако, возможно ли выборочно определить реализацию для методов на макетируемых объектах?

В идеале я бы хотел это сделать (RhinoImplement - это расширение Rhino, которое, я надеюсь, существует!):

var messages = new List<IMessage>();

IBus bus = MockRepository.GenerateMock<IBus>();

bus.RhinoImplement(b => b.Send(Arg<IMessage>.Is.Anything), imess => messages.Add(imess));

//now run your test on the Class that uses IBus

//now, I can inspect my local (List<IMessage>)messages collection

Обновление с ответом

Благодаря ответу Патрика, приведенному ниже, правильный код для достижения вышеуказанного:

var messages = new List<IMessage>();

IBus bus = MockRepository.GenerateMock<IBus>();

bus
    .Expect(b => b.Send(Arg<IMessage>.Is.Anything))
    .WhenCalled(invocation => messages.Add((IMessage)invocation.Arguments[0]))
    .Repeat.Any() //the repeat part is because that method might be called multiple times

//now run your test on the Class that uses IBus

//now, I can inspect my local (List<IMessage>)messages collection

Ответы [ 2 ]

4 голосов
/ 11 мая 2011
0 голосов
/ 04 октября 2017

Следующий код работает с использованием заглушки Rhino вместо Mock. Чтобы заглушить метод с побочными эффектами.

    private IGuy DefaultDood()
    {
        var guyStub = MockRepository.GenerateStub<IGuy>();

        guyStub.Expect(u => u.DrinkHouseholdProducts(Arg<string>.Is.Anything)).WhenCalled(invocation =>
            {
                guyStub.JustDrank = ((string)invocation.Arguments.First());
                guyStub.FeelingWell = false;
            }
        );

        return guyStub;
    }
...