Unité Test du site Web ASP.net Code de projet stocké dans App_Code

J’ai un projet de site Web ASP.net (.net 3.5). Actuellement, tous les fichiers de code non codés (y compris les fichiers Linq2Sql, les contextes de données, la logique métier, les méthodes d’extension, etc.) se trouvent dans le dossier App_Code.

Je suis intéressé par l’introduction de tests unitaires (en utilisant nunit) dans au moins certaines sections du projet qui vont de l’avant. Tout test d’unité que je ferais devrait avoir un access complet à tout le code qui se trouve actuellement dans le dossier App_Code. J’ai fait quelques premières lectures jusqu’à présent et le consensus semble être:

  • Cela ne sera pas possible compte tenu de ma configuration actuelle
  • Les tests unitaires nécessitent le référencement de classes faisant partie d’une DLL compilée et, par définition, un projet de site Web ne se comstack qu’au moment de l’exécution.
  • Pour continuer, je devrai soit convertir tout mon projet en une application Web, soit déplacer tout le code que je voudrais tester (c.-à-d. Tout le contenu de App_Code) dans un projet de bibliothèque de classes et référencer la bibliothèque de classes. projet dans le projet de site Web. Chacune de ces options donnera access aux classes dont j’ai besoin au format dll compilé, ce qui me permettra de les tester.

Est-ce correct? Ou existe-t-il une autre façon de tester les unités sans restructurer / refactoriser tout mon projet?

Vos conclusions semblent correctes. Je voterais pour déplacer la fonctionnalité dans un ou plusieurs projets de bibliothèque de classes, car cela pourrait ouvrir la porte à la réutilisation des mêmes fonctionnalités dans d’autres projets.

Mon magasin a finalement trouvé une réponse à cette question pour notre projet MVC. Et je veux le partager car j’ai chassé beaucoup d’obstacles ici sur StackOverflow en entendant beaucoup de gens dire que cela ne pouvait pas être fait. Nous le faisons comme ceci:

  • Ouvrez le dossier MVC “en tant que site Web, à partir de iis local”, ce qui permet à intellisense et au débogage de fonctionner correctement
  • Ajouter un projet de test unitaire qui réside dans notre répertoire contrôlé par la source
  • Ajoutez une étape de pré-génération au projet TEST, car nous ne pouvons pas en append à un projet ouvert en tant que site Web. Imagine website est \ FooSite et notre projet de test est \ FooSite.Tests. Le code de l’application compilée se retrouvera dans FooSite.Tests \ FooSite_Precomstackd \ bin.
  • *

   
  • Ajoutez une référence à FooSite_Precomstackd / bin / App_Code.dll dans votre projet de test.
  • Boom c’est ça. Vous pouvez avoir votre gâteau et le manger aussi. Chaque fois que vous cliquez sur Créer dans votre solution, vous appelez l’outil aspnet_comstackr.ext sur votre site Web csproj (qui existe toujours) qui, contrairement à MSBuild, comstack app_code et Debug = “true” vous permet d’entrer dans app_code. code dll lors du débogage de votre test unitaire. Et vous ne devez créer que lorsque vous exécutez des tests unitaires mis à jour. Lorsque vous examinez les effets de votre modification sur la page, il vous suffit de modifier Code / Enregistrer / Actualiser la page car le dossier app_code est compilé dynamicment lorsqu’il est appelé depuis votre serveur Web.

Nous avons ce problème dans mon entreprise (Mon patron n’aime pas les DLL, certaines erreurs sur le versioning …)

Nous avons deux moyens de le contourner que nous utilisons fréquemment:

1) Obtenez l’outil CI pour effectuer les tests unitaires: nous utilisons TeamCity qui a une intégration NUnit assez étroite, et notre solution est suffisamment rapide (et dispose de peu de tests) pour que cela soit une option valide.

2) Précomstackr manuellement et tester les binarys résultants: Il est tout à fait possible de lancer le compilateur / MSBuild ASP.net à partir de la ligne de commande (comme si vous faisiez un build ‘Publish’) et de tester les binarys.

Toutefois, si vous avez la possibilité de séparer le code en fichiers binarys (bibliothèques de classes) ou simplement en utilisant une application Web, je vous suggérerais que ce soit une meilleure alternative.

Si quelqu’un devait implémenter la solution de Brian, voici un fichier Website.targets que vous pouvez inclure dans la solution de test unitaire. Il (re) comstack le site Web uniquement lorsque App_Code change. Ajoutez juste quelque chose comme

   MyWebsite ..     

à votre .csproj, en personnalisant WebsiteName et WebsitePath et vous devriez être prêt à partir. Website.targets:

              

Il semble que cela soit possible tout en utilisant encore App_code , mais je voudrais soit déplacer cette logique vers son propre projet de bibliothèque de classes, soit changer le type de projet en application Web, comme le suggèrent Fredrik et Colin.

Je crée toujours mes propres projets ASP.NET en tant que projets d’applications Web et non pas de sites Web.

Et comme l’OP a déclaré qu’il est également possible de passer à un projet Web App, ce que je dirais également plus propre, vos pages peuvent restr dans le projet d’application wep, vous les aurez dans 1 DLL (testable). Toute votre logique métier, etc. va dans une bibliothèque / bibliothèque de classes séparée.

Il est possible de créer des classes de test stockées dans le dossier App_Code sans convertir votre projet en application Web ou déplacer vos classes dans un projet de bibliothèque de classes.

Il suffit de définir les actions de compilation des fichiers de code sur Comstackr. Cela entraînera le débogage et le test unitaire de votre site Web pour générer un fichier .dll.

Maintenant, lorsque vous référencez votre projet de site Web à partir du projet de test unitaire, les classes du dossier app_code seront visibles.

REMARQUE:

Si vous configurez l’ Build Action de Comstack vos fichiers .cs, votre site Web générera un fichier .dll lors du débogage et des tests unitaires. Le fichier .dll posera des problèmes lorsque vous déboguez votre site Web car IIS va maintenant trouver votre code à deux endroits, le répertoire bin et le dossier App_Code et ne saura pas lequel utiliser. Je viens de supprimer le fichier .dll lorsque je veux déboguer.

J’ai dû changer la solution de Brian White en ajoutant l’atsortingbut PhysicalPath . En outre, je n’utilise pas le Default Web Site et je devais modifier la propriété VirtualPath utilisant le nom de mon site Web.

    

Le dll résultant sera à MySite_Precomstackd\App_Code.dll