Eu sou novo em testes de unidade e estou tentando descobrir se devo começar a usar mais modificadores de acesso 'internos'. Sei que se usarmos 'internal' e definirmos a variável de montagem 'InternalsVisibleTo', poderemos testar funções que não queremos declarar públicas do projeto de teste. Isso me faz pensar que eu sempre deveria usar 'interno' porque pelo menos cada projeto (deveria?) Tem seu próprio projeto de teste. Vocês podem me dizer uma razão pela qual eu não deveria fazer isso? Quando devo usar 'privado'?
c#
.net
unit-testing
tdd
Hertanto Lie
fonte
fonte
System.Diagnostics.Debug.Assert()
os próprios métodos.Respostas:
As classes internas precisam ser testadas e há um atributo de montagem:
Adicione isso ao arquivo de informações do projeto, por exemplo
Properties\AssemblyInfo.cs
.fonte
private
, mas muitasprivate
coisas podem muito bem apontar para umainternal
classe que está lutando para ser extraída. TDD ou nenhum TDD, eu prefiro ter mais testes que testam muito código do que ter poucos testes que exercitam a mesma quantidade de código. E evitar testarinternal
coisas não ajuda exatamente a alcançar uma boa proporção.#if DEBUG
, o#endif
bloco ativará essa opção apenas nas compilações de depuração.Se você quiser testar métodos particulares, dê uma olhada
PrivateObject
ePrivateType
noMicrosoft.VisualStudio.TestTools.UnitTesting
espaço para nome. Eles oferecem wrappers fáceis de usar em torno do código de reflexão necessário.Documentos: PrivateType , PrivateObject
Para o VS2017 e 2019, você pode encontrá-los baixando o nuget MSTest.TestFramework
fonte
Adicionando à resposta de Eric, você também pode configurar isso no
csproj
arquivo:Ou, se você tiver um projeto de teste por projeto a ser testado, poderá fazer algo assim no seu
Directory.Build.props
arquivo:Consulte: https://stackoverflow.com/a/49978185/1678053
Exemplo: https://github.com/gldraphael/evlog/blob/master/Directory.Build.props#L5-L12
fonte
Continue usando privado por padrão. Se um membro não deve ser exposto além desse tipo, ele não deve ser exposto além desse tipo, mesmo dentro do mesmo projeto. Isso mantém as coisas mais seguras e organizadas - quando você está usando o objeto, fica mais claro quais métodos você deve usar.
Dito isto, acho razoável tornar os métodos naturalmente privados internos para fins de teste às vezes. Eu prefiro isso do que usar reflexão, que é refatoração hostil.
Uma coisa a considerar pode ser um sufixo "ForTest":
Então, quando você estiver usando a classe dentro do mesmo projeto, é óbvio (agora e no futuro) que você realmente não deveria usar esse método - ele está lá apenas para fins de teste. Isso é um pouco hacky, e não é algo que eu mesmo faço, mas pelo menos vale a pena considerar.
fonte
ForTest
abordagem, mas sempre a acho feia (adicionar código que não fornece valor real em termos de lógica de negócios de produção). Normalmente eu acho que eu tinha que usar a abordagem porque o projeto é somwhat infeliz (ou seja, ter de repor as instâncias únicas entre os testes)ForTest
está obviamente errado, enquanto que, se você apenas tornar o método interno, parece bom usá-lo.Você também pode usar private e chamar métodos privados com reflexão. Se você estiver usando o Visual Studio Team Suite, ele possui uma funcionalidade interessante que irá gerar um proxy para chamar seus métodos particulares. Aqui está um artigo de projeto de código que demonstra como você pode fazer o trabalho sozinho para testar métodos privados e protegidos:
http://www.codeproject.com/KB/cs/testnonpublicmembers.aspx
Em termos de qual modificador de acesso você deve usar, minha regra geral é começar com privado e escalar conforme necessário. Dessa forma, você expõe o mínimo possível de detalhes internos da sua classe e isso ajuda a manter os detalhes da implementação ocultos, como deveriam.
fonte
Estou usando
Dotnet 3.1.101
e as.csproj
adições que funcionaram para mim foram:Espero que isso ajude alguém lá fora!
fonte