Nhibernate测试驱动开发Word文件下载.docx
《Nhibernate测试驱动开发Word文件下载.docx》由会员分享,可在线阅读,更多相关《Nhibernate测试驱动开发Word文件下载.docx(52页珍藏版)》请在冰豆网上搜索。
三持久化操作
1.会话和会话工厂
要进行持久化操作,必须先取得ISession和ISessionFactory,我们用一个Sessions类来封装它们,Sessions类的属性和方法都是静态的,它有一个Factory属性,用于返回ISessionFactory,有一个GetSession方法,用于取得一个新的ISession。
测试类代码如下:
style="
BORDER-RIGHT:
black1pxsolid;
PADDING-RIGHT:
4px;
BORDER-TOP:
PADDING-LEFT:
PADDING-BOTTOM:
BORDER-LEFT:
PADDING-TOP:
BORDER-BOTTOM:
BACKGROUND-COLOR:
#ededed"
usingSystem;
usingNUnit.Framework;
usingNHibernate;
namespaceNHibernateTest
{
///
///SessionsFixture的摘要说明。
///
[TestFixture]
publicclassSessionsFixture
{
publicSessionsFixture()
//
//TODO:
在此处添加构造函数逻辑
}
[Test]//测试能否取得NHB会话工厂。
publicvoidFactoryTest()
ISessionFactorysf=Sessions.Factory;
Assert.IsNotNull(sf,"
getsessionfactoryfail!
"
);
[Test]//测试能否取得NHB会话。
publicvoidGetSessionTest()
ISessions=Sessions.GetSession();
Assert.IsNotNull(s,"
getsessionfail!
}
现在还没写Sessions类,将不能通过编译!
下面我们来实现Sessions类.
usingSystem.Reflection;
///Sessions的摘要说明。
publicclassSessions
privatestaticreadonlyobjectlockObj=newobject();
privatestaticISessionFactory_factory;
publicSessions()
publicstaticISessionFactoryFactory
get
if(_factory==null)
lock(lockObj)
NHibernate.Cfg.Configurationcfg=newNHibernate.Cfg.Configuration();
cfg.AddAssembly(Assembly.GetExecutingAssembly());
_factory=cfg.BuildSessionFactory();
return_factory;
publicstaticISessionGetSession()
returnFactory.OpenSession();
OK,现在编译可以通过了,启动NUnit并选择生成的文件NHibernateTest.exe,运行测试。
我们得到了红色的条,出错了!
原来还没有加入NHibernate的配置信息(当使用NHibernate时,需要在项目的配置文件中加入NHibernate的配置信息。
关于配置信息,在下面有说明)。
在项目的配置文件App.Config(如没有请自行创建一个)中加入以下内容.
稍做解释,下面的配置文件主要是配置了NHibernate和log4net,例如配置了NHibernate连接数据库的连接字符串;
log4net把日志记到哪个文件中,本例就是"
log.txt"
。
每次写日志向文件中追加,而不是重写
xmlversion="
1.0"
encoding="
utf-8"
?
>
<
configuration>
<
configSections>
sectionname="
nhibernate"
type="
System.Configuration.NameValueSectionHandler,System,Version=1.0.5000.0,Culture=neutral,PublicKeyToken=b77a5c561934e089"
/>
log4net"
log4net.Config.Log4NetConfigurationSectionHandler,log4net"
configSections>
nhibernate>
add
key="
hibernate.show_sql"
value="
true"
hibernate.connection.provider"
NHibernate.Connection.DriverConnectionProvider"
hibernate.dialect"
NHibernate.Dialect.MsSql2000Dialect"
hibernate.connection.driver_class"
NHibernate.Driver.SqlClientDriver"
hibernate.connection.connection_string"
Server=127.0.0.1;
initialcatalog=Northwind;
Userid=golinjoe;
Password=2525775"
nhibernate>
log4net>
appendername="
rollingFile"
log4net.Appender.RollingFileAppender,log4net"
>
paramname="
File"
AppendToFile"
RollingStyle"
Date"
DatePattern"
yyyy.MM.dd"
StaticLogFileName"
layouttype="
log4net.Layout.PatternLayout,log4net"
ConversionPattern"
%d[%t]%-5p%c[%x]<
%X{auth}>
-%m%n"
layout>
appender>
root>
priorityvalue="
ALL"
appender-refref="
root>
log4net>
再次运行测试,就可以看见绿色的条了。
在取得会话工厂的代码中,我使用了如下代码:
if(_factory==null){
lock(lockObj){
//buildsessionfactorycode;
}
这是一个典型的doublelock方式,用来产生线程安全的Singletion(单例)对象。
2.基本CRUD操作
在很多介绍NHB的文章,包括NHB带的测试用例中,业务对象只是做为一个数据实体存在的,它没有任何操作!
这在java中是比较典型的作法。
而我希望我们的业务对象自身就能完成基本的Create/Retrieve/Update/Delete,即CRUD操作,
在罗斯文商贸应用中,存在客户(customer)业务对象,先来为它建立一个测试用例,
///CustomerFixture的摘要说明。
publicclassCustomerFixture
publicCustomerFixture()
{}
[Test]//测试Customer对象的CRUD操作。
publicvoidTestCRUD()
Customerc=newCustomer();
c.CustomerId="
test"
;
c.CompanyName="
companyname"
c.ContactName="
contactname"
c.Address="
address"
c.Create();
//测试insert操作,
Customerc2=newCustomer(c.CustomerId);
//测试retrieve操作.
Assert.AreEqual(c2.CompanyName,"
"
savecompanynamefail!
"
c2.CompanyName="
updatename"
c2.Update();
//测试update操作.
Customerc3=newCustomer(c.CustomerId);
Assert.AreEqual(c3.CompanyName,"
updatecompanynamefail!
c3.Delete();
//测试delete操作.
接下来创建Customer业务类:
///Customer的摘要说明。
publicclassCustomer:
BizObject
publicCustomer(){}
publicCustomer(stringexistingId):
base(existingId){}
#regionpersistentproperties.
privatestring_customerId=string.Empty;
privatestring_companyName=string.Empty;
privatestring_contactName=string.Empty;
privatestring_contactTitle=string.Empty;
privatestring_address=string.Empty;
privatestring_city=string.Empty;
privatestring_region=string.Empty;
privatestring_postalCode=string.Empty;
privatestring_country=string.Empty;
privatestring_phone=string.Empty;
privatestring_fax=string.Empty;
publicstringCustomerId
get{return_customerId;
set{_customerId=value;
publicstringCompanyName
get{return_companyName;
set{_companyName=value;
publicstringContactName
get{return_contactName;
set{_contactName=value;
publicstringContactTitle
get{return_contactTitle;
set{_contactTitle=value;
publicstringAddress
get{return_address;
set{_address=value;
publicstringCity
get{return_city;
set{_city=value;
publicstringRegion
get{return_region;
set{_region=value;
publicstringPostalCode
get{return_postalCode;
set{_postalCode=value;
publicstringCountry
get{return_country;
set{_country=value;
publicstringPhone
get{return_phone;
set{_phone=value;
publicstringFax
get{return_fax;
set{_fax=value;
#endregion
在Customer类中,没有实现CRUD操作,这些操作在业务对象基类BizObject中实现,代码如下:
///BizObject的摘要说明。
publicclassBizObject
publicBizObject(){}
publicBizObject(objectexistingId)
ObjectBroker.Load(this,existingId);
publicvirtualvoidCreate()
ObjectBroker.Create(this);
publicvirtualvoidUpdate()
ObjectBroker.Update(this);
publicvirtualvoidDelete()
ObjectBroker.Delete(this);
BizObject简单的将数据操作转发至ObjectBroker类,目的是为了降低业务层和NHB之间的耦合,以利于持久层间的移植。
bl