Obter falha de compilação de executores de teste automatizados (como o NCrunch ) pode ser bastante irritante. Mas é possível escrever testes sem receber nenhum erro de compilação como feedback em C #? Bem, com a dynamic
palavra-chave você pode!
Esta dica é na verdade de @markrendle , que mostrou isso na conferência # leetspeak12 . No entanto, não consegui encontrar nenhum artigo descrevendo isso, então vou postar a ideia aqui.
Etapa 1. Crie uma fábrica de tipo dinâmico
Se você realmente deseja ser capaz de inicialmente testar a unidade de uma classe que ainda não existe, sem nenhum erro de compilação , você pode começar criando um prático auxiliar de fábrica que cria seus tipos dinamicamente como este:
class TypeFactory {
public static dynamic Build {
get {
return new TypeFactory();
}
}
}
Isso foi simples, não?
O método de fábrica (que é tecnicamente uma propriedade chamada neste caso Build
) retornará uma instância da classe de fábrica como um dynamic
, ou seja, um certo algo com propriedades e métodos que serão resolvidos durante a execução. Por causa disso, você pode usar a fábrica dinâmica para criar qualquer coisa de qualquer tipo, mesmo objetos de tipos que ainda não foram definidos, diretamente em seus testes.
O exemplo abaixo usa a fábrica dinâmica invocando a Build
propriedade seguida por outra propriedade que deve criar nosso objeto indefinido atualmente como este:
var myNewObj = TypeFactory.Build.MyNewObj;
Este trecho de código não mostrará nenhum erro de construção, mas lançará durante o tempo de execução um, RuntimeBinderException
já que TypeFactory não tem uma propriedade MyNewObj implementada nem está dinamicamente definida. Mas isso é o suficiente para escrevermos o primeiro teste com falha e a ideia é estender a fábrica conforme você cria novos tipos para seus testes. Continuaremos com um exemplo abaixo.
Etapa 2. Crie um teste de unidade que teste algo de tipo desconhecido – torne-o vermelho
Digamos que queremos criar uma classe chamada Roman, que gere numerais romanos a partir de numerais arábicos representados como string e como inteiro, respectivamente.
Portanto, vamos começar com um caso de teste simples antes de escrever a classe (em vez do mantra red-green-refactor do TDD). Conforme explicado acima, podemos obter qualquer tipo da fábrica dinâmica por meio da propriedade getter seguida pela propriedade getter que cria o tipo que você deseja, iremos com o nome :TypeFactory.Build
Roman
[Test]
public void RomanNumeralOne() {
var roman = TypeFactory.Build.Roman;
Assert.That(r.ToRoman(1), Is.EqualTo("I");
}
Observe que não temos erros de construção aqui, mesmo que não haja nada no TypeFactory
que tenha a Roman
propriedade. No entanto, conforme esperado durante a execução, o teste ficará vermelho devido a a RuntimeBinderException
. Implementar este caso de teste será fácil.
Etapa 3. Consertar o teste de falha – torná-lo verde
Vamos começar modificando a fábrica de tipos para retornar o novo objeto:
public class TypeFactory {
// ... keep the Build property
public Roman Roman { get { return new Roman(); } }
}
Usando Resharper ou Coderush, a geração da nova classe (com a coisa mais simples que poderia funcionar para o teste) deve ser ridiculamente rápida e fácil:
public class Roman {
public string ToRoman(int arabic) { return "I" };
}
O teste deve ser verde . Ensaboe, enxágue e repita a partir da etapa 2. Continue com TDD: ing para implementar o resto da aula.
Etapa 4. Lucro!
Feliz TDD: ing!