2009-07-29 9 views
43

Tengo un proyecto de sitio web ASP.net (.net 3.5). Actualmente, todos los archivos de código que no son de código subyacente (incluidos los elementos de Linq2Sql, contextos de datos, lógica comercial, métodos de extensión, etc.) se encuentran en la carpeta App_Code.Pruebas unitarias Sitio web ASP.net Código de proyecto almacenado en App_Code

Estoy interesado en introducir Unit Testing (usando nunit) en al menos algunas secciones del proyecto en progreso. Cualquier prueba de unidad que yo haría necesitaría tener acceso completo a todo el código que se encuentra actualmente en la carpeta App_Code. He hecho un poco de lectura inicial hasta el momento, y el consenso parece ser:

  • Esto no será posible dada mi configuración actual
  • Prueba de la unidad requiere hacer referencia a las clases que son parte de un archivo DLL compilado, y una Web Site Project, por definición, solo compila en tiempo de ejecución.
  • Para proceder, tendré que convertir mi proyecto completo a una aplicación web, o mover todo el código que me gustaría probar (es decir, todo el contenido de App_Code) a un proyecto de biblioteca de clase y referencia el proyecto de la biblioteca de la clase en el proyecto del sitio web. Cualquiera de estos proporcionará acceso a las clases que necesito en formato dll compilado, lo que me permitirá probarlos en una unidad.

¿Es esto correcto? ¿O hay otra forma en que puedo probar la unidad sin reestructurar/refactorizar todo el proyecto?

Respuesta

19

Sus conclusiones parecen correctas. Yo votaría por trasladar la funcionalidad a uno o varios proyectos de biblioteca de clases, ya que eso podría abrir la puerta para reutilizar la misma funcionalidad en otros proyectos también.

1

Y como OP dijo que también es posible pasar a un proyecto de aplicación web, lo que diría que es más limpio, sus páginas pueden permanecer en el proyecto de la aplicación wep, las tendrá en 1 DLL (comprobable). Toda su lógica de negocios, etc. va en una biblioteca de clases/bibliotecas separadas.

+0

A pesar de este conocimiento es útil, no creo que esto es una buena respuesta ya que se afirma en la pregunta que el PO sabe cómo hacer esto. Además, creo que esta pregunta está dirigida a personas que ya saben esto. –

2

Parece que esto es posible mientras utilizo App_code, pero ya sea movería esta lógica a su propio proyecto de biblioteca de clase o cambiaría el tipo de proyecto a Aplicación web, como sugieren Fredrik y Colin.

Siempre creo mis propios proyectos ASP.NET como proyectos de aplicaciones web, no como sitios web.

+0

Gracias por el enlace. Definitivamente parece una solución fea. –

+0

Sí absolutamente, por lo tanto, mejor bajar por una de las rutas más sensatas. – RichardOD

11

Tenemos este problema en mi empresa (Mi jefe no le gusta DLL, algunos basura acerca de las versiones ...)

Tenemos dos formas redondas que que usamos con frecuencia:

1) Get la herramienta de CI para hacer las pruebas unitarias: utilizamos TeamCity, que tiene una integración NUnit bastante estrecha, y nuestra solución se construye lo suficientemente rápido (y tiene pocas pruebas suficientes) para que esta sea una opción válida.

2) Precompila y prueba manualmente los binarios resultantes: es perfectamente posible ejecutar el compilador ASP.net/MSBuild desde la línea de comandos (como si estuvieras haciendo una compilación 'Publicar') y simplemente probar los binarios resultantes .

Sin embargo, si tiene la opción de segregar el código en binarios (bibliotecas de clases) o simplemente usar una aplicación web, sugeriría que es una mejor alternativa.

+5

Versiones de dlls before .Net era una pesadilla. Creo que esto fue apodado "dll hell". Con .Net esto ya no es un problema. – TheLukeMcCarthy

20

Mi tienda finalmente ha trabajado con una respuesta para esto para nuestro proyecto MVC. Y quiero compartirlo ya que perseguí un montón de callejones sin salida aquí en StackOverflow al escuchar que mucha gente dice que no se pudo hacer.Lo hacemos así:

  • Abrir la carpeta MVC "como un sitio web, desde IIS locales", que obtiene IntelliSense y depuración de funcionar correctamente
  • Añadir un proyecto de prueba de unidad que vive en nuestro directorio controlado fuente
  • Agregue un paso de preconstrucción al proyecto de PRUEBA, ya que no podemos agregar uno a un proyecto que está abierto como sitio web. Imagine el sitio web es \ FooSite y , nuestro proyecto de prueba es \ FooSite.Test. El código de la aplicación compilada terminará en en FooSite.Tests \ FooSite_Precompiled \ bin.
  • *
<Target Name="BeforeBuild"> 
    <AspNetCompiler VirtualPath="FooSite" TargetPath="$(ProjectDir)\FooSite_Precompiled" Force="true" 
Debug="true" /> </Target> 
  • añadir una referencia a la FooSite_Precompiled/bin/App_Code.dll en su proyecto de prueba.
  • Boom eso es todo. Puedes tener tu pastel y comértelo también. Cada vez que haga clic en Crear en su solución, llame a la herramienta aspnet_compiler.ext en su sitio web csproj (que todavía existe) que es capaz, a diferencia de MSBuild, de compilar app_code, y Debug = "true" le permite el paso en el código app_code.dll al depurar su prueba de unidad. Y usted solo necesita compilar cuando está ejecutando pruebas de unidades actualizadas. Cuando está viendo los efectos de su cambio en la página, acaba de Cambiar código/Guardar/Actualizar página ya que la carpeta app_code se compila dinámicamente cuando se la llama desde su servidor web.
+0

Esta debería ser la respuesta aceptada. Añadiré que es bastante lento ejecutar AspNetCompiler cuando construyo el proyecto de prueba, así que estoy usando una tarea Exec para ejecutar una compilación de solo los archivos App_Code. –

+0

¿Cómo lo configuraste exactamente? ¿Una tarea ejecutiva de invocar un comando particular de msbuild? ¿Podría compartir un ejemplo? –

+0

Utilizamos una herramienta patentada a la que se llama con una tarea Exec, pero debe ser posible llamando directamente a CSC o con un archivo de proyecto separado que incluya todos los archivos fuente en la carpeta App_Code. Es curioso que debe preguntar esto ahora, ya que recientemente me encontré con un problema con este sistema en Visual Studio 2012. He publicado una pregunta para ver si alguien puede ayudar a resolver el problema, e incluí un proyecto de ejemplo con una configuración similar a la del uno que estoy usando: http://stackoverflow.com/questions/13138820/visual-studio-2012-msbuild-incremental-build-not-detecting-changes –

5

alguien debería encontrarse implementación de la solución de Brian, aquí es presentar una Website.targets se puede incluir en una solución de prueba de la unidad. Solo (re) compila el sitio web cuando App_Code cambia. Sólo tiene que añadir algo así como

<PropertyGroup> 
    <WebsiteName>MyWebsite</WebsiteName> 
    <WebsitePath>..</WebsitePath> 
    </PropertyGroup> 
    <Import Project="$(ProjectDir)\Website.targets" /> 
    <Target Name="BeforeBuild" DependsOnTargets="CompileWebsite"> 
    </Target> 

a su .csproj, la personalización de WebsiteName y WebsitePath y que debe estar listo para funcionar. Website.targets:

<?xml version="1.0" encoding="utf-8"?> 
<!-- 
    Target that compiles Website's App_Code to be used for testing 
    --> 
<Project DefaultTargets="CompileWebsite" ToolsVersion="4.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003"> 
    <ItemGroup> 
    <AppCodeFiles Include="$(WebsitePath)\$(WebsiteName)\App_Code\**\*.*" /> 
    </ItemGroup> 
    <Target Name="CompileWebsite" Inputs="@(AppCodeFiles)" Outputs="$(ProjectDir)\PrecompiledWeb\bin\App_Code.dll"> 
    <AspNetCompiler VirtualPath="$(WebsiteName)" PhysicalPath="$(WebsitePath)\$(WebsiteName)" TargetPath="$(ProjectDir)\PrecompiledWeb" Force="true" Debug="true" /> 
    </Target> 
    <Target Name="CleanWebsite"> 
    <RemoveDir Directories="$(WebsitePath)\$(WebsiteName)\PrecompiledWeb" /> 
    </Target> 
</Project> 
0

Es posible clases de prueba de unidad almacenados en la carpeta App_Code sin necesidad de convertir su proyecto para una aplicación web o mover sus clases a un proyecto de biblioteca de clases.

Todo lo que necesita es establecer las acciones de compilación de los archivos de código para compilar. Esto causará que Debugging y Unit Testing tu sitio web muestren un archivo .dll.

Ahora cuando hace referencia al proyecto de su sitio web desde el proyecto de prueba de la unidad, las clases en la carpeta app_code estarán visibles.

NOTA:

Ajuste de los archivos .cs Build Action a Compile hará que su sitio web para generar un archivo .dll en la depuración y pruebas unitarias. El archivo .dll causará problemas cuando depure su sitio web porque IIS ahora encontrará su código en dos lugares, el contenedor y la carpeta App_Code y no sabrá cuál usar. Actualmente solo elimino el archivo .dll cuando quiero depurar.

+0

No entiendo por qué mi respuesta fue rechazada. El OP estaba equivocado al pensar que la única forma de probar la unidad es mover el código a un proyecto de biblioteca de clase o convertir la solución a una aplicación web y mi respuesta muestra cómo realizar pruebas unitarias manteniendo el código en la carpeta app_code. Si mi respuesta está en un formato pobre, espero que el votante inferior le explique lo que no les gusta. –

0

Tuve que cambiar la solución de Brian White agregando el atributo PhysicalPath.Además, no estoy usando el Default Web Site y tuve que cambiar la propiedad VirtualPath al nombre de mi sitio web.

<Target Name="BeforeBuild"> 
    <AspNetCompiler VirtualPath="myIISsitename.com" PhysicalPath="$(SolutionDir)MySiteFolder" TargetPath="$(ProjectDir)\MySite_Precompiled" Force="true" Debug="true" /> 
</Target> 

El DLL resultante será en MySite_Precompiled\App_Code.dll

Cuestiones relacionadas