2009-07-31 6 views
16

Je me lance dans des tests unitaires de la manière Visual-Studio 2008, et je me demande quelle est la meilleure façon d'accéder à l'ensemble de l'ensemble class à des fins de test.Comment accéder aux classes d'un autre ensemble à des fins de tests unitaires?

Fondamentalement, j'ai deux projets dans une solution:

  1. MyProject (C#)
  2. MyProjectTests (Projet C# test)

Tout dans MyProject a actuellement l'accessibilité par défaut, si je rappeler correctement signifie que tout est effectivement internal. Je cherche principalement à tester au niveau class, mais il y a quelques delegates impliqués.

Il y aura probablement une API externe dans le futur, mais j'ai environ 20% de fonctionnalités complètes (au moins sur papier) et je me méfie de la superposition de code en plus noyau non testé. En conséquence, je voudrais faire des tests maintenant, avant que l'application soit suffisamment complète pour les tests fonctionnels traditionnels (lire: mauvais et/ou paresseux) et définitivement avant que l'API externe de la version n + 1 ne soit disponible.

En plus d'une réponse claire, un exemple de la solution serait grandement apprécié.

+1

Pour prévenir votre prochaine question - pourquoi être signé si l'ensemble est testé signé l'ensemble de test? - Voici mon article sur ce sujet: http://blogs.msdn.com/ericlippert/archive/2009/06/04/alas-smith-and-jones.aspx –

Répondre

28

Pour cela, vous pouvez utiliser l'attribut de niveau d'assemblage InternalsVisibleToAttribute.

Ajouter

[assembly:InternalsVisibleTo("MyProjectTests")] 

à AssemblyInfo.cs dans votre assemblée MyProject.

+0

Avec référence de clé de nom fort approprié inclus, bien sûr - Vous êtes fort en nommant vos assemblées, n'est-ce pas? –

3

Vous devez ajouter

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

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

+2

lien brisé s'il vous plaît corriger – Darcy

1

On dirait que vous avez besoin du InternalsVisibleToAttribute

Cependant, je vous recommande contre cette approche - tester vos classes internes via l'interface publique ou de l'API.

+0

Le problème est que ceux-ci n'existent pas encore; et ne le fera pas pendant un certain temps. Son genre d'un grand projet (ou, il sera terminé). –

+0

Le problème avec l'approche à l'envers est que vous pouvez vous retrouver dans une situation où vous avez fait l'interne .. mais l'API externe ne se branche pas comme prévu - parce qu'il y avait une déconnexion dans la compréhension. Les commentaires viennent beaucoup plus tard .. quand il est plus coûteux de rectifier. – Gishu

+0

Il est vrai, mais remettre à plus tard les tests en profondeur jusqu'à ce que l'application soit "terminée" ne fait que mendier des ennuis. De plus, l'API externe va probablement prendre la forme d'automatiser l'action de l'utilisateur et extraire des données plutôt que d'étendre les fonctionnalités; C'est beaucoup plus difficile à bousiller par rapport à une API plugin complet. –

3

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

[assemblage: InternalsVisibleTo ("MyProjectTestsNameSpace.MyProjectTests ")]

Plus d'infos est here

+0

le lien est cassé :( – User193452

0

Bien que [InternalsVisibleTo] est moyen le plus judicieux de l'OMI, il y a au moins 2 autres façons d'aller à ce sujet:

  • En utilisant Reflection

    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 ou la signature de la méthode change, le test unitaire commencera à échouer au moment de l'exécution, alors que [InternalsVisibleTo] aurait facilement été détecté lors de la rupture de la compilation.

Questions connexes