Question

Je me lance dans les tests unitaires de Visual-Studio 2008 et je me demande quel est le meilleur moyen d'obtenir un accès de classe croisé à des fins de test.

En gros, j'ai deux projets dans une solution:

  1. MyProject (C #)
  2. MyProjectTests (projet de test C #)

Tout dans MyProject a actuellement une accessibilité par défaut, ce qui, si je me souviens bien, signifie que tout est effectivement interne . Je cherche principalement à tester au niveau classe , mais quelques délégués sont impliqués.

Il y aura probablement une API externe dans le futur, mais je suis à peu près à 20% de la fonctionnalité complète (au moins sur papier) et je me méfie assez de la superposition de code supplémentaire sur cette page non testée. coeur. Par conséquent, j'aimerais que certains tests soient terminés maintenant, avant que l'application ne soit suffisamment complète pour les tests fonctionnels classiques (lire: mauvais et / ou paresseux) et avant que la version n + 1 de l'API externe ne soit opérationnelle.

En plus d’une réponse directe, un exemple de solution serait grandement apprécié.

Était-ce utile?

La solution

Vous pouvez utiliser l'attribut au niveau de l'assemblage InternalsVisibleToAttribute pour y parvenir.

Ajouter

[assembly:InternalsVisibleTo("MyProjectTests")]

à AssemblyInfo.cs dans votre assembly MyProject.

Autres conseils

Vous pouvez tester les méthodes internes en ajoutant un attribut à AssemblyInfo.cs pour votre projet principal, en donnant accès aux méthodes internes à un assembly nommé:

[assembly: InternalsVisibleTo (" MyProjectTestsNameSpace.MyProjectTests "))

Plus d'infos sur ici

Vous devez ajouter

[assembly:InternalsVisibleTo("Unit.Tests.Assembly")] 

dans AssemblyInfo.cs de votre "MyProject (C #)". Cela permet ensuite à vos tests d'accéder aux méthodes de test internes.

Il semblerait que vous ayez besoin de InternalsVisibleToAttribute

Toutefois, je vous déconseille cette approche: testez vos classes internes via l'interface publique ou l'API.

Bien que [InternalsVisibleTo] soit le moyen le plus judicieux pour l'OMI, il existe au moins deux autres moyens de procéder:

  • En utilisant Réflexion

     var method = instance.GetType().GetMethod(
        methodName, BindingFlags.NonPublic | BindingFlags.Instance, 
        null, paramTypeArray, null);
     return method.Invoke(instance, parameters);
    

Le problème avec cette approche est que si le nom de la méthode ou la signature change, le test unitaire commencera à échouer au moment de l'exécution, alors que [InternalsVisibleTo] aurait facilement été détecté lors de la dernière modification effectuée lors de la compilation. temps.

J'ai trouvé celui-ci https://msdn.microsoft.com/en -us / library / hh598957.aspx J'espère que cela pourra aider quelqu'un.

Résumé:

  • Dans votre projet de test unitaire, ajoutez une référence au code testé. Voici comment créer la référence à un projet de code dans la même solution:
  • Sélectionnez le projet dans l'Explorateur de solutions.
  • Dans le menu Projet, choisissez Ajouter une référence ....
  • Dans la boîte de dialogue Gestionnaire de référence, ouvrez le noeud Solution et choisissez Projets.
  • Vérifiez le nom du projet de code et fermez la boîte de dialogue.
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top