• NHibernate学习(二)测试NHibernate如何工作


    原文出处:http://www.cnblogs.com/abluedog/archive/2006/04/15/375940.html?login=1#commentform

    原文作者:abluedog

    感谢abluedog的原创,本人借以学之,由于原文有一点未尽详细,未能顺利通过,故改之!

     

    提示:为了在VS2005IDE中获得NHibernate配置文件的代码提示,请将nhibernate-configuration-2.0.xsdnhibernate-mapping-2.0.xsd(这两个文件在你从网上下载NHibernate程序集文件时一并下载,此处http://www.nhibernate.org/有下载,当前版本是2.0.1.GA拷贝到\Program Files\Microsoft Visual Studio 8\Xml\Schemas下,这样当你编辑配置文件或者映射文件时,你将得到完整的代码提示。

     

    NHibernat内部使用log4net(此程序集从上面的网址中下载NHibernate程序集时一并下载)来进行日志操作,今天我们将在配置文件中添加log4net的配置,这样我们在测试的时候将可以清楚地看到NHibernate是如何进行工作的。

    应用配置文件修改如下:

    <configuration>

         <configSections>

             <section name="nhibernate" type="System.Configuration.NameValueSectionHandler, System,Version=1.0.5000.0,Culture=neutral, PublicKeyToken=b77a5c561934e089" />

             <section name="log4net" type="log4net.Config.Log4NetConfigurationSectionHandler,log4net" />

        </configSections>

         <nhibernate>

             <add key="hibernate.connection.provider" value="NHibernate.Connection.DriverConnectionProvider" />

             <add key="hibernate.connection.driver_class" value="NHibernate.Driver.SqlClientDriver" />

             <add key="hibernate.connection.connection_string" value="Server=localhost;Initial Catalog=TestNHibernate;Integrated Security=SSPI" />

             <add key="hibernate.connection.isolation" value="ReadCommitted"/>

             <add key="hibernate.dialect" value="NHibernate.Dialect.MsSql2005Dialect" />

             <add key="show_sql" value="true" />

         </nhibernate>

         <log4net>

            <appender name="ConsoleAppender" type="log4net.Appender.ConsoleAppender" >

                <layout type="log4net.Layout.PatternLayout">

                    <conversionPattern  value="%date [%thread] %-5level %logger [%ndc] - %message%newline" />

                </layout>

            </appender>

            <root>

                <level value="ALL" />

                <appender-ref ref="ConsoleAppender" />

            </root>

        </log4net>

    </configuration>

     

    请注意添加:

    <add key="show_sql" value="true" />

    关于log4net的使用,我们这里不做详细的讲解,有兴趣的请参考如下地址:

    http://logging.apache.org/log4net/

    接着,我们在上次的工程组中添加一个名为Test1的测试项目(用VS新建项目时,新建一个测试项目加入解决方案中),将其中的不需要的手动测试去掉。请注意:除了NHibernateDemo1.Model(上个工程生成的实体程序集)引用外,还需要添加如下3个引用:

    log4net,System.Data,System.Xml.

     

    修改代码如下:

    using System;

    using System.Text;

    using System.Collections.Generic;

    using Microsoft.VisualStudio.TestTools.UnitTesting;

     

    using NHibernate;

    using NHibernate.Cfg;

    using log4net;

    using log4net.Config;

    using Demo1.Model;

     

    namespace Test1

    {

        /// <summary>

        /// UnitTest1 的摘要说明

        /// </summary>

        [TestClass]

        public class UnitTest1

        {

            static ISessionFactory factory;

            static ILog logger;

            ISession session;

     

            public UnitTest1()

            {

                //

                // TODO: 在此处添加构造函数逻辑

                //

            }

     

            #region 添加测试属性

     

            [ClassInitialize()]

            public static void MyClassInitialize(TestContext testContext)

            {

                XmlConfigurator.Configure();

                logger = LogManager.GetLogger(typeof(Test1.UnitTest1));

                Configuration config = new Configuration().AddAssembly("Demo1.Model");

              

                factory = config.BuildSessionFactory();

            }

     

            [ClassCleanup()]

            public static void MyClassCleanup() { }

     

            [TestInitialize()]

            public void MyTestInitialize()

            {

                session = factory.OpenSession();

            }

     

            [TestCleanup()]

            public void MyTestCleanup()

            {

                session.Close();

            }

     

            #endregion

           

        }

    }

    我们在测试的开始对Configuration\SessionFactory\Log进行初始化。在每一个Test的开始获取一个新的session,每一个Test结束后即关闭session

    [TestMethod]

    public void TestRead()

    {

    User user = (User)session.Get(typeof(User), 1);//1是第插入记录的主键ID

    Assert.IsTrue(user.FirstName  == "aaa");

    }

    Test项目中添加一个配置文件,把上面的的配置文件拷贝一份到此配置文件中(内容完全相同),否则会报一些The dialect was not set的错误。

     

    我们切换到Test Results窗口,双击测试成功的TestRead方法,这时将会有一个详细的测试结果显示出来,NHibernate将使用我们指定的log4net来输出详细信息,我们仔细观察:

    2010-04-23 22:11:04,640 [AdpaterExeMgrThread1] DEBUG NHibernate.Impl.SessionImpl [(null)] - opened session

    2010-04-23 22:11:04,640 [AdpaterExeMgrThread1] DEBUG NHibernate.Impl.SessionImpl [(null)] - loading [User#1]

    2010-04-23 22:11:04,656 [AdpaterExeMgrThread1] DEBUG NHibernate.Impl.SessionImpl [(null)] - attempting to resolve [User#1]

    2010-04-23 22:11:04,656 [AdpaterExeMgrThread1] DEBUG NHibernate.Impl.SessionImpl [(null)] - object not resolved in any cache [Demo1.Model.User#1]

    2010-04-23 22:11:04,656 [AdpaterExeMgrThread1] DEBUG NHibernate.Persister.Entity.AbstractEntityPersister [(null)] - Fetching entity: [Demo1.Model.User#1]

    2010-04-23 22:11:04,656 [AdpaterExeMgrThread1] DEBUG NHibernate.Loader.Loader [(null)] - loading entity: [Demo1.Model.User#1]

    2010-04-23 22:11:04,750 [AdpaterExeMgrThread1] DEBUG NHibernate.Impl.BatcherImpl [(null)] - Opened new IDbCommand, open IDbCommands: 1

    2010-04-23 22:11:04,750 [AdpaterExeMgrThread1] DEBUG NHibernate.Impl.BatcherImpl [(null)] - Building an IDbCommand object for the SqlString: SELECT user0_.UserId as UserId1_0_, user0_.FirstName as FirstName1_0_, user0_.LastName as LastName1_0_, user0_.Sex as Sex1_0_, user0_.Age as Age1_0_, user0_.RoleId as RoleId1_0_ FROM Users user0_ WHERE user0_.UserId=?

    2010-04-23 22:11:04,750 [AdpaterExeMgrThread1] DEBUG NHibernate.Type.Int32Type [(null)] - binding '1' to parameter: 0

    2010-04-23 22:11:04,750 [AdpaterExeMgrThread1] INFO  NHibernate.Loader.Loader [(null)] - SELECT user0_.UserId as UserId1_0_, user0_.FirstName as FirstName1_0_, user0_.LastName as LastName1_0_, user0_.Sex as Sex1_0_, user0_.Age as Age1_0_, user0_.RoleId as RoleId1_0_ FROM Users user0_ WHERE user0_.UserId=@p0

    2010-04-23 22:11:04,750 [AdpaterExeMgrThread1] DEBUG NHibernate.SQL [(null)] - SELECT user0_.UserId as UserId1_0_, user0_.FirstName as FirstName1_0_, user0_.LastName as LastName1_0_, user0_.Sex as Sex1_0_, user0_.Age as Age1_0_, user0_.RoleId as RoleId1_0_ FROM Users user0_ WHERE user0_.UserId=@p0; @p0 = '1'

    2010-04-23 22:11:04,750 [AdpaterExeMgrThread1] DEBUG NHibernate.Connection.DriverConnectionProvider [(null)] - Obtaining IDbConnection from Driver

    2010-04-23 22:11:05,718 [AdpaterExeMgrThread1] DEBUG NHibernate.Impl.BatcherImpl [(null)] - Opened IDataReader, open IDataReaders: 1

    2010-04-23 22:11:05,718 [AdpaterExeMgrThread1] DEBUG NHibernate.Loader.Loader [(null)] - processing result set

    2010-04-23 22:11:05,718 [AdpaterExeMgrThread1] DEBUG NHibernate.Loader.Loader [(null)] - result set row: 0

    2010-04-23 22:11:05,734 [AdpaterExeMgrThread1] DEBUG NHibernate.Loader.Loader [(null)] - result row: 1

    2010-04-23 22:11:05,734 [AdpaterExeMgrThread1] DEBUG NHibernate.Loader.Loader [(null)] - Initializing object from DataReader: [Demo1.Model.User#1]

    2010-04-23 22:11:05,734 [AdpaterExeMgrThread1] DEBUG NHibernate.Loader.Loader [(null)] - Hydrating entity: Demo1.Model.User#1

    2010-04-23 22:11:06,031 [AdpaterExeMgrThread1] DEBUG NHibernate.Type.StringType [(null)] - returning 'He' as column: FirstName1_0_

    2010-04-23 22:11:06,031 [AdpaterExeMgrThread1] DEBUG NHibernate.Type.StringType [(null)] - returning 'Vihone' as column: LastName1_0_

    2010-04-23 22:11:06,031 [AdpaterExeMgrThread1] DEBUG NHibernate.Type.StringType [(null)] - returning 'Boy' as column: Sex1_0_

    2010-04-23 22:11:06,031 [AdpaterExeMgrThread1] DEBUG NHibernate.Type.Int32Type [(null)] - returning '30' as column: Age1_0_

    2010-04-23 22:11:06,031 [AdpaterExeMgrThread1] DEBUG NHibernate.Type.Int32Type [(null)] - returning '1' as column: RoleId1_0_

    2010-04-23 22:11:06,031 [AdpaterExeMgrThread1] DEBUG NHibernate.Loader.Loader [(null)] - done processing result set (1 rows)

    2010-04-23 22:11:06,031 [AdpaterExeMgrThread1] DEBUG NHibernate.Driver.NHybridDataReader [(null)] - running NHybridDataReader.Dispose()

    2010-04-23 22:11:06,062 [AdpaterExeMgrThread1] DEBUG NHibernate.Impl.BatcherImpl [(null)] - Closed IDataReader, open IDataReaders :0

    2010-04-23 22:11:06,062 [AdpaterExeMgrThread1] DEBUG NHibernate.Impl.BatcherImpl [(null)] - Closed IDbCommand, open IDbCommands: 0

    2010-04-23 22:11:06,062 [AdpaterExeMgrThread1] DEBUG NHibernate.Impl.ConnectionManager [(null)] - aggressively releasing database connection

    2010-04-23 22:11:06,062 [AdpaterExeMgrThread1] DEBUG NHibernate.Connection.ConnectionProvider [(null)] - Closing connection

    2010-04-23 22:11:06,078 [AdpaterExeMgrThread1] DEBUG NHibernate.Loader.Loader [(null)] - total objects hydrated: 1

    2010-04-23 22:11:06,078 [AdpaterExeMgrThread1] DEBUG NHibernate.Impl.SessionImpl [(null)] - resolving associations for: [Demo1.Model.User#1]

    2010-04-23 22:11:06,093 [AdpaterExeMgrThread1] DEBUG NHibernate.Impl.SessionImpl [(null)] - loading [Role#1]

    2010-04-23 22:11:06,421 [AdpaterExeMgrThread1] DEBUG NHibernate.Impl.SessionImpl [(null)] - done materializing entity [Demo1.Model.User#1]

    2010-04-23 22:11:06,421 [AdpaterExeMgrThread1] DEBUG NHibernate.Impl.SessionImpl [(null)] - initializing non-lazy collections

    2010-04-23 22:11:06,421 [AdpaterExeMgrThread1] DEBUG NHibernate.Loader.Loader [(null)] - done entity load

    2010-04-23 22:11:06,421 [AdpaterExeMgrThread1] DEBUG NHibernate.Impl.ConnectionManager [(null)] - after autocommit

    2010-04-23 22:11:06,421 [AdpaterExeMgrThread1] DEBUG NHibernate.Impl.ConnectionManager [(null)] - aggressively releasing database connection

    2010-04-23 22:11:06,421 [AdpaterExeMgrThread1] DEBUG NHibernate.Impl.SessionImpl [(null)] - transaction completion

    2010-04-23 22:11:06,437 [AdpaterExeMgrThread1] DEBUG NHibernate.Impl.SessionImpl [(null)] - closing session

    2010-04-23 22:11:06,437 [AdpaterExeMgrThread1] DEBUG NHibernate.Impl.BatcherImpl [(null)] - running BatcherImpl.Dispose(true)

     

    如上初体所示,NHibernate替我们构造了一条sql语句,并添加一个参数,然后将我们在代码中赋的id1来填充,这样,一条完整的可以执行的sql语句产生了。

    请注意:在产生sql语句的前面,NHibernate构造了一个IDBCommand,然后在sql语句产生完全后,获取连接,通过一个DataReader来填充Persion对象给我们使用,这就是NHibernate替我们做的事。

    请仔细研究输出的日志。

     

    如法炮制,我们添加另外3Test,完成单个表的全部CRUD操作,如下完整代码:

    [TestMethod]

            public void TestCreate()

            {

     

                User user = new User();

                user.FirstName = "xxx";

                user.LastName = "yyy";

                user.Age = 100;

                user.Sex = "girl";

     

                Role role = new Role();

                role.RoleName = "普通用户";//

                role.Id = 2;//这个Id的值必须在数据库的Role表中有此记录,主外键约束

     

                ITransaction trans = session.BeginTransaction();

                try

                {

                    session.Save(user);

                    trans.Commit();

                    Assert.IsTrue(user.Id > 0);

                }

                catch (Exception ex)

                {

                    trans.Rollback();

                    Assert.Fail(ex.Message);

                }

            }

     

     

            [TestMethod]

            public void TestUpdate()

            {

     

                User user = (User)session.Get(typeof(User), 2);//此处的ID要与表中记录的主键ID相同

                user.FirstName = "ggg";  //可以是任何user的属性,或多个属性

                ITransaction trans = session.BeginTransaction();

     

                try

                {

                    session.Save(user);

                    trans.Commit();

     

                    Assert.IsTrue(user.FirstName == "ggg");//与上面更新的值要相同

                }

                catch (Exception ex)

                {

                    trans.Rollback();

                    Assert.Fail(ex.Message);

                }

            }

     

     

            [TestMethod]

            public void TestDelete()

            {

                User user = (User)session.Get(typeof(User), 2);//此处的ID要与表中记录的主键ID相同,依主键值找到记录

                ITransaction trans = session.BeginTransaction();

                try

                {

                    session.Delete(user);

                    trans.Commit();

                }

                catch (Exception ex)

                {

                    trans.Rollback();

                    Assert.Fail(ex.Message);

                }

            }

    }

     

    Delete的方法如下:

    void Delete(object obj);

    直接传入需要delete的对象即可。

    项目工程图 如下:(图中的NHibernateTest1程序集的名称实际为文章中的Demo1.Model,生成程序集的名字与项目名字不同)

    点击【应用】进行测试,结果所有的方法都应该是通过。

     

     

     

  • 相关阅读:
    【转】 mysql反引号的使用(防冲突)
    【百度一键分享功能】百度一键分享插件
    【WEB2.0】 网页调用QQ聊天(PC+M站)
    python : takes 0 positional arguments but 1 was given
    python : 设计模式之外观模式(Facade Pattern)
    Tosca : 扩展dll动态语言 识别点击下拉, 识别成table
    Tosca : 把 inner text 放到变量里,定义变量,使用变量
    Tosca:键盘输入字符串
    Tosca 给定义变量,取内容放到变量里
    Tosca :配置环境参数
  • 原文地址:https://www.cnblogs.com/vihone/p/1719038.html
Copyright © 2020-2023  润新知