Альтернативный способ сделать это - создать оболочку для SmtpClient, которая реализует тот же интерфейс. Затем введите и используйте оболочку в вашем классе. При выполнении модульного тестирования вы можете заменить фиктивную оболочку, которая имеет ожидания для вызовов методов и ответов.
EDIT : Обертка необходима (по крайней мере для RhinoMocks), поскольку SmtpClient не является производным от интерфейса и не имеет виртуальных методов. Если вы используете фальшивый фреймворк, который может напрямую имитировать класс без виртуальных методов, вы можете пропустить обертку и напрямую ввести макет SmtpClient.
public class SmtpClientWrapper
{
private SmtpClient Client { get; set; }
public SmtpClientWrapper( SmtpClient client )
{
this.Client = client;
}
public virtual void Send( MailMessage msg )
{
this.Client.Send( msg );
}
...
}
public class MyClass
{
private SmtpClientWrapper Client { get; set; }
public MyClass( SmtpClientWrapper client )
{
this.Client = client;
}
public void DoSomethingAndNotify()
{
...
this.Client.Send( msg );
}
}
Протестировано (с RhinoMocks) как:
public void DoSomethingAndNotifySendsAMessageTest()
{
SmtpClientWrapper client = MockRepository.GenerateMock<SmtpClientWrapper>();
client.Expect( c => c.Send( new MailMessage() ) ).IgnoreArguments();
MyClass klass = new MyClass( client );
klass.DoSomethingAndNotify();
client.VerifyAllExpectations();
}