ASP.NET - Como você o Teste de Unidade WebControls?
-
09-06-2019 - |
Pergunta
Tudo bem.
Então, eu acho que é hora de eu entrar em testes de unidade, uma vez que todos estão batendo na sobre-lo por tempo suficiente.Eu tenho instalado o NUnit e passou por algumas "introdução ao teste de unidade" tipo de tutoriais.
Atualmente estou montando um pequeno framework para ajudar com a reconstrução de um de nossos aplicativos da web, então, eu criei um VS2008 projeto para o meu quadro e eu quero para o teste de unidade é como eu ir.
Como na terra, posso fazer o teste de unidade o WebControls?Os métodos são todos protegidos ou privado, e desde que é um framework, não há muito mais, mas WebControls.
Os ponteiros?
Queimaduras
Solução
Você pode fazer o model-view-controller ou model-view-presenter tipo de arquiteturas sem usar um completo framework.Você já descobriu que o teste de unidade de interface de componentes é difícil.Existem maneiras de contornar isso, mas você provavelmente não quer ir por esse caminho.Normalmente, isso vai fazer seus testes muito difíceis de manter, mais manutenção pesadelo é algo que os programadores podem fazer sem :-)
Tente separar a funcionalidade que você deseja testar em um "controlador" ou "apresentador" de classe.Em seguida, teste a que classe.Para torná-lo mais testável você pode ocultar a classe usercontrol (a vista) por trás de uma interface e fazer o controlador ou apresentador de talk para a visualização através da interface.De que maneira você pode mock-up o modo de exibição nos testes.
Eu sei que isso soa como um monte de trabalho e parece que uma solução alternativa, mas se você se acostumar a esta que é realmente uma bela arquitetura que o torna muito mais fácil para alterar a interface do usuário do comportamento.Você sempre poderá iniciar a utilização de um "real" mvc framework quando você realmente precisar dele :-)
Outras dicas
Ues a assembly:InternalsVisibleTo
atributo e você será capaz de acessar os membros privados.
Colocá-lo em seu webcontrol do projeto AssemblyInfo.cs (sob Propriedades nó)
[assembly:InternalsVisibleTo("YourTestProjectName")]
Você encontrou o ponto de dificuldade maior de ASP.NET.Na medida do selado, aulas particulares que dificultam o teste de unidade.
Esta é a principal razão que TDD pessoas irá usar um framework MVC (ASP.NET MVC, Castle MonoRail) como ele fornece uma clara separação de seus modelos de modo de exibição e o seu controlador de lógica.Os controladores são totalmente testável.
Você também pode olhar para teste de componentes através do navegador como um usuário iria vê-los usando um framework de testes, tais como WebAii.Eu tenho visto de trabalho e o seu muito legal.Eu também já foi dito, você pode ligá-lo em automatizada builds, mas eu não tenho visto isso ainda.
Espero que ajude ...
Este é um artigo antigo, por agora, mas eu estava usando NUnitASP para escrever testes para o nunit asp.net WebControls em 2004.Que artigo fornece um exemplo detalhado de testes de um simples controle usando o seu conceito de criação de um correspondente do "Testador" de classe que encapsula os detalhes de seu controle a partir de testes de você.O Testador pode (deve) ser também no mesmo assembly, como o seu controlo de forma a que possa compartilhar algumas coisas entre eles (por exemplo,utilitário de funções, constantes, etc.).
Eu usei a técnica (e outros, o uso de variantes da técnica) ainda hoje para teste muito controles sofisticados.
Espero que seja útil.
O framework MVC mencionado acima é a melhor maneira de testar o que o comando faz.No entanto, o teste de como ele funciona é um pouco diferente.
Isso é totalmente fora do punho, mas você poderia fazer o controle de usuário expor alguns protegido métodos e propriedades para retornar informações de validação e, em seguida, ter um teste de controle de usuário herdar.Esse controle pode preencher campos, pressione os botões e o que não.Tipo de confuso mas poderia funcionar.
Você também pode dar uma olhada neste Rhino Iglu quadro.Ele é comprometido framework MVC para WebForms.
Ivonna pode testar WebControls em isolamento, dentro da Asp.Net contexto Apenas a sessão de chamada.GetControl("Caminho.ascx") e certifique-se de que possui todas as propriedades necessárias.
Você os teste como este:
[Test]
public void ConditionQueryBuilderTest_RendersProperHtml()
{
var sw = new StringWriter();
var queryBuilder = new ConditionQueryBuilderStub
{
ID = "UnitTestbuilder",
QueryBuilderURL = @"\SomeAspxPage\SomeWebMethod",
ResetQueryBuilderURL = @"\SomeAspxPage\OnQueryBuilderReset",
FilterValuesCollection = new Dictionary<int, string> { {15, "Some Condition"}}
};
queryBuilder.RenderAllContents(new HtmlTextWriter(sw));
AppendLog(sw.ToString());
Assert.AreEqual(ExpectedHtml, sw.ToString()); // ExpectedHTML is the raw expected HTML
}
Aqui é o meu stub:
internal class ConditionQueryBuilderStub : ConditionQueryBuilder // ConditionQueryBuilder is a WebControl
{
internal void RenderAllContents(HtmlTextWriter writer)
{
RenderContents(writer);
}
}