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

Foi útil?

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);
    }
}
Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top