Testando classes concretas

Ha pouco tempo, estava trabalhando no desenvolvimento de uma aplicação e me deparei com um problema: precisava testar uma classe que não possuía uma interface definida para ela, isto é, uma classe concreta. Dando uma estudada, encontrei o Microsoft Fakes.

Case:

Imagine que você tem um método que irá enviar uma saudação diferente para o usuário baseando-se no horário:

  • Se o horário for das 00:00 até as 11:59 a aplicação vai saudar o usuário dizendo “Bom dia”
  • se o horário for 12:00 as 17:59 a aplicação vai saudar o usuário dizendo “Boa tarde”
  • se o horário for acima das 18:00 a aplicação vai saudar o usuário dizendo “Boa noite”

Veja o código abaixo:

public class Saudacao
    {
        public string Saudar()
        {
            if (DateTime.Now.TimeOfDay <= new TimeSpan(11, 59, 59))                 return "Bom dia!";             else if (DateTime.Now.TimeOfDay > new TimeSpan(11, 59, 59) && DateTime.Now.TimeOfDay <= new TimeSpan(17, 59, 59))                 return "Boa tarde!";             else if (DateTime.Now.TimeOfDay > new TimeSpan(17, 59, 59))
                return "Boa noite!";
 
 
            return string.Empty;
        }
    }

Com este tipo de implementação, acaba ficando difícil testar as condições devido ao método estár trabalhando com o DateTime.Now. Como é que eu testo isso já que o Datetime.Now pega a hora do SO ? É ai que entra o Microsoft Fakes.

Veja a implementação dos testes:

Primeiro eu vou criar o Fakes da System.dll (É nela que fica a classe DateTime).

Fake da system

agora o código utilizando o fakes:

public class QuandoForDia : DadoUmaSaudacao
{
        Saudacao saudacao;
        string msg;

        protected override void Establish_context()
        {
            base.Establish_context();
 
            saudacao = new Saudacao();
        }
 
        protected override void Because_of()
        {
            base.Because_of();
            using (ShimsContext.Create())
            {
                var dt = new System.DateTime(2015, 08, 11, 10, 00, 00);
                System.Fakes.ShimDateTime.NowGet = () => { return dt; };
 
                msg = saudacao.Saudar();
            }
 
        }
 
        [Test]
        public void EntaoSaudoComBomDia()
        {
            msg.ShouldEqual("Bom dia!");
        }
    }

É um exemplo bem simples, porém já da para ter uma ideia do potencial deste recurso 😀

É importante lembrar também, que esse recurso é bem útil em sistemas legados,  caso veja esteja desenvolvendo uma aplicação nova, não esqueça do DIP dos princípios SOLID .

A Demo esta disponível no meu GitHub

Sugestões, Criticas, duvidas, são todas bem vindas!

Anúncios

2 comentários sobre “Testando classes concretas

Deixe um comentário

Preencha os seus dados abaixo ou clique em um ícone para log in:

Logotipo do WordPress.com

Você está comentando utilizando sua conta WordPress.com. Sair /  Alterar )

Foto do Google+

Você está comentando utilizando sua conta Google+. Sair /  Alterar )

Imagem do Twitter

Você está comentando utilizando sua conta Twitter. Sair /  Alterar )

Foto do Facebook

Você está comentando utilizando sua conta Facebook. Sair /  Alterar )

w

Conectando a %s