unit testingASP.net网站项目代码存储在App_Code中
我有一个ASP.net网站项目(.net 3.5)。 目前所有的代码文件后面的代码(包括Linq2Sql的东西,数据上下文,业务逻辑,扩展方法等)都位于App_Code文件夹中。
我有兴趣在推进项目的至less一些部分引入unit testing(使用nunit)。 我将要做的任何unit testing都需要完全访问当前位于App_Code文件夹中的所有代码。 到目前为止,我已经做了一些初步的阅读,共识似乎是:
- 这是不可能的,因为我目前的设置
- unit testing需要引用属于已编译的dll的一部分类,并且按照定义,“网站项目”仅在运行时进行编译。
- 为了继续,我将需要将我的整个项目转换为一个Web应用程序,或将我想testing的所有代码(即:App_Code的全部内容)移动到类库项目中,并引用类库项目在网站项目。 其中任何一个将提供我需要在编译的DLL格式,这将允许我unit testing他们需要的类访问。
它是否正确? 还是有另一种方式,我可以unit testing没有重构/重构我的整个项目?
你的结论似乎正确。 我会投票将function移到一个或多个类库项目中,因为这可能会打开在其他项目中重复使用相同function的大门。
我的商店终于为我们的MVC项目做了一个回答。 我想分享它,因为我在StackOverflow上追赶了很多死胡同,听到很多人说这是无法完成的。 我们这样做:
- 打开MVC文件夹“作为一个网站,从本地iis”这是得到intellisense和debugging工作正常
- 添加一个位于我们的源代码pipe理目录中的unit testing项目
- 向TEST项目添加预构build步骤,因为我们无法将其添加到作为网站打开的项目中。 想象一下网站是\ FooSite,我们的testing项目是\ FooSite.Tests。 已编译的应用程序代码将在FooSite.Tests \ FooSite_Precompiled \ bin中结束。
*
<Target Name="BeforeBuild"> <AspNetCompiler VirtualPath="FooSite" TargetPath="$(ProjectDir)\FooSite_Precompiled" Force="true" Debug="true" /> </Target>
- 在您的testing项目中添加对FooSite_Precompiled / bin / App_Code.dll的引用。
- 轰隆就是这样。 你可以吃你的蛋糕,也可以吃。 每次在解决scheme中单击Build时,都会调用网站csproj(仍然存在)上的aspnet_compiler.ext工具,与MSBuild不同,它可以编译app_code,Debug =“true”允许您进入app_code。debugging你的unit testing时,DLL代码。 当你运行更新的unit testing时,你只需要Build。 当您在页面上查看更改的效果时,只需更改代码/保存/刷新页面,因为从Web服务器调用app_code文件夹时会dynamic编译。
我们在我的公司有这个问题(我的老板不喜欢DLL,一些关于版本的垃圾…)
我们有两种方法可以经常使用:
1)获取CI工具来进行unit testing:我们使用TeamCity,它具有非常紧密的NUnit集成,而且我们的解决scheme构build足够快(并且有足够less的testing),因此这是一个有效的select。
2)手动预编译和unit testing得到的二进制文件:完全可以从命令行运行ASP.net编译器/ MSBuild(就好像你正在做一个“发布”版本),只是unit testing结果二进制文件。
但是,如果您有将代码分隔成二进制文件(类库)或仅使用Web应用程序的选项,我build议将其作为一个更好的select。
如果有人发现自己实现了Brian的解决scheme,那么可以在unit testing解决scheme中包含一个Website.targets文件。 它只能在App_Code更改时重新编译网站。 只要添加类似的东西
<PropertyGroup> <WebsiteName>MyWebsite</WebsiteName> <WebsitePath>..</WebsitePath> </PropertyGroup> <Import Project="$(ProjectDir)\Website.targets" /> <Target Name="BeforeBuild" DependsOnTargets="CompileWebsite"> </Target>
到您的.csproj,自定义WebsitePath
和WebsitePath
,你应该准备好去。 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>
看起来像这样仍然可以使用App_code ,但是我会把这个逻辑移出到它自己的类库项目或者像Fredrik和Colin所说的那样把项目types改成Web Application。
我总是创build自己的ASP.NET项目作为Web应用程序项目而不是网站。
正如OP所说,也可以转移到一个Web应用程序项目,我也会说它更清洁,您的页面可以留在wep应用程序项目中,您将拥有1个DLL(可testing)。 所有的业务逻辑等都在一个单独的类库/库中。
可以unit testing存储在App_Code文件夹中的类,而无需将您的项目转换为Web应用程序或将您的类移动到类库项目。
所有这一切都需要将代码文件的“构build操作”设置为“编译”。 这将导致debugging和unit testing您的网站输出一个.dll文件。
现在,当您从unit testing项目引用您的网站项目时,app_code文件夹中的类将可见。
注意:
设置你的.cs文件“ Build Action
to Compile
会导致你的网站在debugging和unit testing中生成一个.dll文件。 当您debugging您的网站时,.dll文件会导致问题,因为IIS现在会在两个位置(bin和App_Code文件夹)中find您的代码,并且不知道要使用哪一个。 我目前只是在我想debugging时删除.dll文件。
我必须通过添加PhysicalPath
属性来更改Brian White的解决scheme。 此外,我没有使用Default Web Site
,必须将VirtualPath
属性更改为我的网站名称。
<Target Name="BeforeBuild"> <AspNetCompiler VirtualPath="myIISsitename.com" PhysicalPath="$(SolutionDir)MySiteFolder" TargetPath="$(ProjectDir)\MySite_Precompiled" Force="true" Debug="true" /> </Target>
得到的DLL将在MySite_Precompiled\App_Code.dll