Достаточно ли моего юнит-теста? - PullRequest
1 голос
/ 07 мая 2009

Я смотрю на модульные тесты, которые я написал для почтовой службы (используя SMTP), и мне интересно, достаточно ли одного конкретного теста. Вот фрагмент моего почтового сервиса:

[PluginFamily("EmailService")]
public interface IEmailService
{
    Boolean SendEmail( string toAddress, string fromAddress, string bccAddress,  string ccAddress, string subject,
                       string body, bool html );
}
[Pluggable("EmailService")]
public class EmailService : IEmailService
{
    private IConfigurationReader _configReader;
    public EmailService(IConfigurationReader configurationReader)
    {
        _configReader = configurationReader;
    }
    public bool SendEmail( string toAddress, string fromAddress, string bccAddress, string ccAddress, string subject, string body, bool isHtml )
    {
        MailMessage email = new MailMessage();

        try
        {
            if (_configReader.TestMode)
            {
                toAddress = _configReader.TestEmailAddress;
            }
        }

        //send email here
     }
}

Я прикалываюсь к IConfigurationReader (в основном это оболочка для ConfigurationManager) и задаю для режима тестирования значение true, чтобы проверить, могу ли я отправить электронное письмо в своем «режиме тестирования». Итак, мой модульный тест выглядит примерно так (это один из моих модульных тестов по методу. У меня 100% охват кода):

    [Test]
    public void Validate_Send_Email_In_Test_Mode()
    {
        bool result;
        MockRepository mockRepository = new MockRepository();
        var mockConfigReader = mockRepository.StrictMock<IConfigurationReader>();


        using (mockRepository.Record())
        {

            SetupResult.For(mockConfigReader.TestMode).Return(true);
            SetupResult.For(mockConfigReader.TestEmailAddress).Return("test@test.com");
            SetupResult.For(mockConfigReader.EmailContentLocation).Return("test");
            SetupResult.For( mockConfigReader.SmtpHost ).Return( "test.mail.com" );
        }

        ObjectFactory.InjectStub(typeof(IConfigurationReader), mockConfigReader);
        emailService = ObjectFactory.GetInstance<IEmailService>();

        using (mockRepository.Playback())
        {
            result = emailService.SendEmail( "testemail@test.com",
                                                  "test@test.com", "", "",
                                                  "this is a unit test - config in test mode", "body of unit test", true );

        }

        Assert.That( result, Is.True );
        ObjectFactory.ResetDefaults();

    }

Достаточно ли этого для юнит-теста? Что я могу сделать, чтобы улучшить его?

Я обеспокоен тем, что просто проверка того, что мой метод возвращает true, не является достаточным модульным тестом.

Ответы [ 4 ]

2 голосов
/ 07 мая 2009

Может ли отправка электронной почты завершиться неудачно? Если это возможно, у вас есть по крайней мере два случая для тестирования, и вашего одного теста недостаточно.

Поскольку у вас есть логическое возвращаемое значение, это подсказывает мне, что вы ожидаете один из двух кодов возврата, поэтому снова вы не тестируете все возможности.

Не говоря уже о том, что при отправке электронной почты возвращаемое значение является наименее важным из результатов функции: получено ли письмо?

2 голосов
/ 07 мая 2009

Я бы порекомендовал вам также включить отрицательные тесты, которые являются «успешными», когда встречаются различные возможные условия ошибки. Например, введите неверный адрес электронной почты и убедитесь, что возвращен правильный код ошибки и / или исключение.

Возможно, вы также захотите создать макет фактического SMTP-сервера. Хотя я не делал большого поиска, я нашел этот сайт SMTP-сервера . Я использовал метод, подобный этому, для тестирования плагина электронной почты моего Java-проекта. Таким образом, вам все равно, находится ли он в «тестовом режиме» или в производстве. Единственная разница - комбинация сервер / порт в вашей конфигурации. Это дает дополнительное преимущество, заключающееся в том, что вы не просто тестируете «тестовый код».

2 голосов
/ 07 мая 2009

Улучшение покрытия кода (все типы)

1 голос
/ 07 мая 2009

Я бы сказал, что эта часть:

    {
        if (_configReader.TestMode)
        {
            toAddress = _configReader.TestEmailAddress;
        }
    }

Кодовый запах. Вы должны передать адрес электронной почты и убедиться, что служба вызывается с тем, что вы передали в качестве параметра методу, и использовать макет, чтобы убедиться, что он был правильно отправлен в API электронной почты. Другими словами, издевайтесь над API электронной почты, не используйте насмешку как объект тестирования сам по себе.

Это может помочь вам поэкспериментировать с написанием этого с другой стороны, сначала протестируйте, где рабочий код пишется, только если вы можете сделать тест, который оправдывает его написание.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...