- Разработка интерфейса, заключающего в себе функциональность вызова базы данных, отправки электронной почты, ...
- Напишите реализацию вашего класса и загрузите этот класс в зависимый класс, используя DI
- Используйте Mock-фреймворк для создания Mock-объекта и установки ожиданий от него в модульном тесте.
Вот пример псевдокода (здесь используется генератор Mock Moq framework):
interface IEmailer
{
void Send(Email email);
}
class RealEmailer : IEmailer
{
public void Send(Email email)
{
// send
}
}
class UsesEmailer
{
private IEmailer _emailer;
public UsesEmailer(IEmailer emailer)
{
_emailer = emailer;
}
public foo(Email email)
{
// does other stuff
// ...
// now sends email
_emailer.Send(email);
}
}
class MyUnitTest
{
[Test]
public Test_foo()
{
Mock<IEmailer> mock = new Mock<IEmailer>();
Email m = new Email();
mock.Expect(e => e.Send(It.Is<Email>(m)));
UsesEmailer u = new UsesEmailer(mock.Object);
u.Send(m);
mock.Verify();
}
}
ОБНОВЛЕНИЕ
Теперь, если вы тестируете RealEmailer
, есть несколько способов, но в основном вам придется настроить тестчтобы отправить вам по электронной почте, и вы регистрируетесь в.Это не совсем модульный тест, так как вы тестируете не только свой код, но и конфигурацию, сеть, сервер обмена, ... фактически, если вы делаете RealEmailer
маленьким, имея мало кода, вы можете пропустить написание модульного теста для него.