安装了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方法中加上下面这句:
运行用例,哈哈,通过!悬着的心终于放下。
总结如下:
在Dotnetnuke4.5下可以对数据库存取进行单元测试,但需要一些额外准备:
1.增加app.config文件,然后从web.config中拷贝配置:
2.在测试用例中Setup方法中配置HostMapSeting
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方法中加上下面这句:
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 >
< 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() + @"";
}
public void Setup()
{
DotNetNuke.Common.Globals.HostMapPath = System.IO.Directory.GetCurrentDirectory() + @"";
}
3. 将Cache对象的程序集(默认是 DotNetNuke.Caching.FileBasedCachingProvider.dll)拷贝到在程序的运行目录下(如debug/)
提醒: 以上代码在vs.net 2005, Dotnetnuke4.5上运行通过