2015-03-11 7 views
1

У меня есть класс почтовой программы, у него есть метод SendMessage, которому нужен объект, реализующий интерфейс IEMailConfiguration. Я хотел высмеять почтовую программу, чтобы она не отправляла почту, а вместо этого просто добавляет заданный объект конфигурации почты в список.Обработка параметризованных вызовов в Rhino Mocks

Это то, что я получил до сих пор (не слишком много, я знаю):

var mailsSent = new List<IEmailConfiguration>(); 
mailerMock = MockRepository.GenerateStrictMock<Mailer>(); 

Я использовал Ожидайте() и Do() требует насмешливый без параметров вызовов, что было довольно легко, но теперь Я не вижу решения: как мне получить аргумент части Expect для использования в вызове Do?

mailerMock.Expect(x=> x.SendMessage(**AnyConfiguration**)).Do(mailsSent.Add(**AnyConfiguration**) 

ответ

1

Возможно, вы хотите использовать WhenCalled метод:

class Program 
    { 
     static void Main() 
     { 
     List<IEmailConfiguration> performedCalls = new List<IEmailConfiguration>(); 

     // preparing test instance 
     var mailerMock = MockRepository.GenerateStrictMock<Mailer>(); 
     mailerMock.Expect(x => x.SendMessage(Arg<DummyEmailConfiguration>.Is.Anything)) 
        .WhenCalled(methodInvocation => // that's what you need 
        { 
         var config = methodInvocation.Arguments.OfType<IEmailConfiguration>().Single(); 
         performedCalls.Add(config); 
        }); 

     // testing 
     for (int i = 0; i < 10; i++) 
     { 
      mailerMock.SendMessage(new DummyEmailConfiguration("world" + i + "@mail.com", "hello world" + i)); 
     } 

     // dumping info 
     foreach (var call in performedCalls) 
     { 
      Console.WriteLine(call); 
     } 
    } 
} 

public interface IEmailConfiguration 
{ 
    string To { get; } 
    string Message { get; } 
} 

public interface Mailer 
{ 
    void SendMessage(IEmailConfiguration config); 
} 

internal class DummyEmailConfiguration : IEmailConfiguration 
{ 
    public DummyEmailConfiguration(string to, string message) 
    { 
     To = to; 
     Message = message; 
    } 

    public string To 
    { 
     get; 
     private set; 
    } 

    public string Message 
    { 
     get; 
     private set; 
    } 
    public override string ToString() 
    { 
     return To + ": " + Message; 
    } 
}