Pergunta

Tenho uma turma com cálculos científicos complexos.Ele está configurado para permitir apenas que um usuário crie um caso instanciado corretamente.Para testar adequadamente o código, no entanto, é necessário definir diretamente as variáveis ​​de estado internas, uma vez que os documentos de referência fornecem esses dados em seus casos de teste.Feito de forma inadequada, porém, pode invalidar o estado.

Portanto, devo ter a capacidade, uma função-membro, de definir variáveis ​​internas dos programas de teste de unidade.Mas eu quero desencorajar fortemente usuários normais chamem esta função.(Sim, um usuário determinado pode mexer com qualquer coisa...mas eu não quero anunciar que existe uma maneira de fazer algo errado.)

Seria bom poder dizer ao Intellisense para não mostrar a função, por exemplo.

A melhor solução que tenho no momento é apenas nomear a função como:Conjunto Perigoso().

Que outras opções eu tenho?

Seguir

Achei a resposta de David B mais útil para minha situação.Obrigado!
A sugestão de Mufasa de usar reflexão foi ótima, mas mais difícil de implementar (para mim).
A sugestão de Chris de usar um decorador foi boa, mas não deu certo.
A sugestão do BFree sobre XML também é boa e já estava em uso, mas na verdade não resolve o problema.

Finalmente, a sugestão de BillTheLizard de que o problema está nos documentos de origem não é algo que eu possa controlar.Especialistas internacionais publicam livros e artigos de periódicos altamente técnicos para uso de sua comunidade.O fato de eles não atenderem às minhas necessidades específicas é um fato da vida.Simplesmente não existem documentos alternativos.

Foi útil?

Solução

Suponha que você queira testar este objeto manipulando seus campos.

public class ComplexCalculation
{
    protected int favoriteNumber;
    public int FavoriteNumber
    {
        get { return favoriteNumber; }
    }
}

Coloque este objeto em seu assembly/namespace de teste:

public class ComplexCalculationTest : ComplexCalculation
{
    public void SetFavoriteNumber(int newFavoriteNumber)
    {
        this.favoriteNumber = newFavoriteNumber;
    }
}

E escreva seu teste:

    public void Test()
    {
        ComplexCalculationTest myTestObject = new ComplexCalculationTest();
        myTestObject.SetFavoriteNumber(3);
        ComplexCalculation myObject = myTestObject;

        if (myObject.FavoriteNumber == 3)
            Console.WriteLine("Win!");

    }

PS:Eu sei que você disse interno, mas acho que você não quis dizer interno.

Outras dicas

Você pode usar InternalsVisibleToAttribute para marcar membros internos como visíveis para seu assembly de teste.Parece brilhar quando usado neste contexto, embora não seja exatamente “amigo”.

  1. Marque o seu DangerousSet função internal em vez de public.

  2. Em Properties\AssemblyInfo.cs do projeto que contém DangerousSet:

    [assembly:InternalsVisibleTo("YourTestAssembly")]

Se você tiver dois assemblies de teste por qualquer motivo, a sintaxe será:

[assembly:InternalsVisibleTo("TestAssembly1"), 
    InternalsVisibleTo("TestAssembly2")]

Decore seu método com este atributo:

[System.ComponentModel.EditorBrowsable(System.ComponentModel.EditorBrowsableState.Never)]

Isso irá ocultá-lo do Intellisense.

EDITAR:

Mas aparentemente isso tem uma advertência bastante significativa:"No Visual C#, EditorBrowsableAttribute não suprime membros de uma classe na mesma assembleia." Através do MSDN.

Parece que o seu verdadeiro problema está nos seus documentos de referência.Você não deve testar casos impossíveis de encontrar com o uso adequado de sua classe.Se os usuários não deveriam ter permissão para alterar o estado dessas variáveis, seus testes também não deveriam.

Você também pode usar reflexão.A pesquisa do Google apareceu Teste de unidade de métodos privados usando reflexão.

Seu código de teste pode incluir uma subclasse da classe de cálculos?Se sim, você pode marcar a função protected e apenas os herdeiros poderão usá-lo.Tenho certeza de que isso também tira o sentido intelectual, mas posso estar errado sobre isso.

O que fiz no passado foi colocar comentários XML no método e usar a seção para escrever em letras grandes e em negrito.NÃO USE ESTE MÉTODO ou qualquer outra coisa.Dessa forma, se alguém tentasse usá-lo, o Intellisense daria um belo aviso.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top