Como classes de acesso em outra montagem para fins de teste de unidade?
-
06-07-2019 - |
Pergunta
Estou saltando para-teste de unidade a maneira Visual Studio-2008, e eu estou querendo saber qual é a melhor maneira de conseguir o acesso class
-montagem cruzada para fins de teste.
Basicamente, eu tenho dois projetos em uma única solução:
- MyProject (C #)
- MyProjectTests (C # Test Project)
Tudo em MyProject atualmente tem acesso padrão, que se bem me lembro significa que tudo está efetivamente internal
. Estou principalmente olhando para teste no nível class
, mas há um delegates
alguns envolvidos.
Provavelmente haverá uma sometime API externa no futuro, mas tenho cerca de 20% do caminho para completar recurso (pelo menos no papel) e eu estou ficando muito desconfiado de camadas mais de código no topo desta testado testemunho. Assim eu gostaria de obter algum teste feito agora, antes do aplicativo é bastante completa para a tradicional (leia-se: má e / ou preguiçoso) testes funcionais e definitivamente antes da versão n + 1 API externa está acima
.Para além de uma resposta linear, um exemplo da solução seria muito apreciada.
Solução
Você pode usar o atributo de montagem de nível InternalsVisibleToAttribute para alcançar este objectivo.
Adicionar
[assembly:InternalsVisibleTo("MyProjectTests")]
para AssemblyInfo.cs no seu MyProject montagem.
Outras dicas
Você pode testar métodos internos, adicionando um atributo para os AssemblyInfo.cs para o seu projeto principal, que dá acesso aos métodos internos a um chamado de montagem:
[montagem: InternalsVisibleTo ( "MyProjectTestsNameSpace.MyProjectTests")]
Mais informações é aqui
Você precisa adicionar
[assembly:InternalsVisibleTo("Unit.Tests.Assembly")]
para AssemblyInfo.cs do seu "MyProject (C #)". Que, em seguida, permite que seus testes para acessar os métodos internos para testar.
Parece que você precisa InternalsVisibleToAttribute
No entanto eu recomendo contra esta abordagem -. Teste de suas classes internas através da interface pública ou API
Embora [InternalsVisibleTo]
é a maneira mais sensata IMO, há pelo menos 2 outras maneiras de fazer isso:
-
Ao usar Reflexão
var method = instance.GetType().GetMethod( methodName, BindingFlags.NonPublic | BindingFlags.Instance, null, paramTypeArray, null); return method.Invoke(instance, parameters);
O problema com esta abordagem é que, se o nome do método ou assinatura mudanças, o teste de unidade irá começar a falhar em tempo de execução, enquanto [InternalsVisibleTo]
teria sido facilmente apanhada esta alteração de quebra em tempo de compilação.
- Use uma estrutura de teste como
Moles / Fakes
ouTypeMock
Eu encontrei este https://msdn.microsoft.com/en -us / library / hh598957.aspx esperança que poderia ajudar alguém.
Sumário:
- Em seu projeto de teste de unidade, adicionar uma referência para o código sob teste. Veja como criar a referência a um projeto de código na mesma solução:
- Selecione o projeto no Solution Explorer.
- No menu Project, escolha Add Reference ....
- Na caixa de diálogo Reference Manager, abra o nó solução e escolher Projetos.
- Verifique o nome do projeto de código e fechar a caixa de diálogo.