Já li várias vezes que métodos estáticos não são recomendados, alguns dizem que dificulta a testabilidade, outros dizem que seu design fica mais estruturado do que orientada a objeto.
Eu sempre concordei com a segunda afirmação, mas eu nunca tinha entendi o porque do problema com testabilidade.
Ontem eu descobri (pelo menos eu acho) e senti na pele o problema. Quando foi você quem criou o método é fácil voltar atrás e refazer o design, mas e qual não foi você?
Pega o exemplo do DateTime, todo mundo usa DateTime.Now, como vou testar uma método que se baseia na hora atual para fazer alguma determinada operação?
Obs.: Mudar a hora do sistema no SetUp e voltar no TearDown não é uma opção J.
O que vocês acham disso? Resolve?
O problema é que o uso dela fica mais complexo do que um simples DateTime.Now.
Galera,
Talvez eu não tinha entendido a questão, mas se o problema é testar algo com uma data ou horário específico, por que não usar o construtor da classe DateTime?
Vamos imaginar que eu precise criar um teste que negue o acesso do usuário ao sistema após o dia 01/09/2009. Qual o problema de utilizar o new DateTime(2009, 09, 01)??
Isso não resolve?
Abraços
--
André Dias
SCJP - SCWCD - MCP - MCTS - CSM
http://blogs.msdn.com/andredias
http://twitter.com/andrediasbr
Resolve se você tiver algum factory que durante os testes possa entregar um determinado DateTime contendo um dia/hora conhecido para o cenário.
Olá André,
O problema é como o sistema obtém a hora.
Vou dar um exemplo: Imagine um workflow onde com 15 dias você precisa iniciar diversos outros processos de alta criticidade pois dada uma determinada lei, com se seu workflow passar de 20 dias a empresa pode ser multada.
A intenção de um caso de teste é, reproduzir o dia 1, o dia 2, uma intervenção no dia 3 e em seguida caminhar para o dia 15 para saber se os processos foram corretamente inicializados.
Neste caso você precisa de alguém para lhe entregar a hora do sistema, que pode ser fake. Nesse ponto você precisa ter um cara que abstraia a origem da data, para que alguém possa entregar datas diferentes de acordo com a utilidade (testes/prod).
> Alguém sugeriu que poderíamos usar mock frameworks para isolar a chamada,
> mas entendo que não é possível. Quando você chama DateTime.Now, você está
> acessando uma propriedade estática Now da classe DateTime, e não há nada que
> um outro objeto possa fazer para interceptar esta chamada e retornar outra
> coisa...
..mas funciona. O TypeMock faz.