安装了Resharper后,NUnit用的是顺风顺水,在vs2005中可以直接运行和调试 测试用例,那是相当的爽。
最近在DNN4.5上开发,写了一些数据库实体类的测试用例,发现竟然不能通过,总是报什么CachingProvider发生 TypeInitializationException 错误。初步判断是DNN的Cache机制,将实体类的反射信息存在Cache中,由于单元测试环境没有网站支撑,导致Cache机制运行失败。
虽然找到原因,可是解决的过程时漫长的。开始怀疑config配置错误(在Nunit的项目中叫app.config,会自动生成对应的dll.config),于是将web.config中的全部搬过来,仍然报错。经过在DNN代码中钻来钻去,终于发现DNN的Cache机制依赖了一个全局变量:DotNetNuke.Common.Globals.HostMapPath,dotnetnuke将Cache信息放到了这个目录下的Cache子目录中,在NUnit运行环境下该变量为空,所以造成错误。
找到错误根源,解决就简单了,抱着一个忐忑的心,在测试用例的SetUp方法中加上下面这句:
DotNetNuke.Common.Globals.HostMapPath = System.IO.Directory.GetCurrentDirectory() + @"/";
运行用例,哈哈,通过!悬着的心终于放下。
总结如下:
在Dotnetnuke4.5下可以对数据库存取进行单元测试,但需要一些额外准备:
1.增加app.config文件,然后从web.config中拷贝配置:
<configSections>
<sectionGroup name="dotnetnuke">
<!-- the requirePermission attribute will cause a syntax warning - please ignore - it is required for Medium Trust support-->
<section name="data" requirePermission="false" type="DotNetNuke.Framework.Providers.ProviderConfigurationHandler, DotNetNuke"/>
<section name="caching" requirePermission="false" type="DotNetNuke.Framework.Providers.ProviderConfigurationHandler, DotNetNuke"/>
</sectionGroup>
</configSections>
<connectionStrings>
<add name="SiteSqlServer" connectionString="Server=(local);Database=dotnetnuke;uid=sa;pwd=1234"
providerName="System.Data.SqlClient" />
</connectionStrings>
<appSettings>
<!-- Connection String for SQL Server 2000/2005 - kept for backwards compatability - legacy modules-->
<add key="SiteSqlServer" value="Server=(local);Database=dotnetnuke;uid=sa;pwd=1234"/>

</appSettings>
<dotnetnuke>
<data defaultProvider="SqlDataProvider">
<providers>
<clear/>
<add name="SqlDataProvider" type="DotNetNuke.Data.SqlDataProvider, DotNetNuke.SqlDataProvider" connectionStringName="SiteSqlServer" upgradeConnectionString="" providerPath="~ProvidersDataProvidersSqlDataProvider" objectQualifier="" databaseOwner="dbo"/>
</providers>
</data>
<caching defaultProvider="FileBasedCachingProvider">
<providers>
<clear/>
<add name="FileBasedCachingProvider" type="DotNetNuke.Services.Cache.FileBasedCachingProvider.FBCachingProvider, DotNetNuke.Caching.FileBasedCachingProvider" providerPath="~ProvidersCachingProvidersFileBasedCachingProvider"/>
<add name="BroadcastPollingCachingProvider" type="DotNetNuke.Services.Cache.BroadcastPollingCachingProvider.BPCachingProvider, DotNetNuke.Caching.BroadcastPollingCachingProvider" providerPath="~ProvidersCachingProvidersBroadcastPollingCachingProvider"/>
</providers>
</caching>
</dotnetnuke>
2.在测试用例中Setup方法中配置HostMapSeting
[SetUp]
public void Setup()
{
DotNetNuke.Common.Globals.HostMapPath = System.IO.Directory.GetCurrentDirectory() + @"";
}
3. 将Cache对象的程序集(默认是DotNetNuke.Caching.FileBasedCachingProvider.dll)拷贝到在程序的运行目录下(如debug/)
提醒: 以上代码在vs.net 2005, Dotnetnuke4.5上运行通过
最近在DNN4.5上开发,写了一些数据库实体类的测试用例,发现竟然不能通过,总是报什么CachingProvider发生 TypeInitializationException 错误。初步判断是DNN的Cache机制,将实体类的反射信息存在Cache中,由于单元测试环境没有网站支撑,导致Cache机制运行失败。
虽然找到原因,可是解决的过程时漫长的。开始怀疑config配置错误(在Nunit的项目中叫app.config,会自动生成对应的dll.config),于是将web.config中的全部搬过来,仍然报错。经过在DNN代码中钻来钻去,终于发现DNN的Cache机制依赖了一个全局变量:DotNetNuke.Common.Globals.HostMapPath,dotnetnuke将Cache信息放到了这个目录下的Cache子目录中,在NUnit运行环境下该变量为空,所以造成错误。
找到错误根源,解决就简单了,抱着一个忐忑的心,在测试用例的SetUp方法中加上下面这句:

总结如下:
在Dotnetnuke4.5下可以对数据库存取进行单元测试,但需要一些额外准备:
1.增加app.config文件,然后从web.config中拷贝配置:
































2.在测试用例中Setup方法中配置HostMapSeting





3. 将Cache对象的程序集(默认是DotNetNuke.Caching.FileBasedCachingProvider.dll)拷贝到在程序的运行目录下(如debug/)
提醒: 以上代码在vs.net 2005, Dotnetnuke4.5上运行通过