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:

  1. MyProject (C #)
  2. 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.

Foi útil?

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.

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