2009-07-01 69 views
3

我试图为我的NHibernate数据访问层实现单元测试。我从网上找到的一个例子(http://blogs.hibernatingrhinos.com/nhibernate/archive/2008/04/01/your-first-nhibernate-based-application.aspx)中抽取的第一个测试只是试图使用我的域类/映射重新创建数据库。我已经能够在C#中使用这个示例(产品表是在数据库中创建的),但是不能在VB.NET中实现时使用。我有Todd.Core(包含Product类和Product.hbm.xml映射)和Todd.Core.Test(包含测试夹具和NHibernate配置)两个项目。当我尝试使用MbUnit的GUI来运行该测试我收到此消息(第10行是在调用.Configure法):实现NHibernate的单元测试生成与VB.NET/MBUnit架构

Message: Could not compile the mapping document: Todd.Core.Product.hbm.xml 

Type: NHibernate.MappingException 
Source: NHibernate 
TargetSite: Void LogAndThrow(System.Exception) 
HelpLink: null 
Stack: at NHibernate.Cfg.Configuration.LogAndThrow(Exception exception) 
    at NHibernate.Cfg.Configuration.AddValidatedDocument(NamedXmlDocument doc) 
    at NHibernate.Cfg.Configuration.ProcessMappingsQueue() 
    at NHibernate.Cfg.Configuration.AddDocumentThroughQueue(NamedXmlDocument document) 
    at NHibernate.Cfg.Configuration.AddXmlReader(XmlReader hbmReader, String name) 
    at NHibernate.Cfg.Configuration.AddInputStream(Stream xmlInputStream, String name) 
    at NHibernate.Cfg.Configuration.AddResource(String path, Assembly assembly) 
    at NHibernate.Cfg.Configuration.AddAssembly(Assembly assembly) 
    at NHibernate.Cfg.Configuration.AddAssembly(String assemblyName) 
    at NHibernate.Cfg.Configuration.DoConfigure(IHibernateConfiguration hc) 
    at NHibernate.Cfg.Configuration.Configure() 
    at Todd.Core.Test.GenerateSchema_Fixture.Can_generate_schema() in C:\Development\Todd\Todd.Core.Test\GenerateSchema_Fixture.vb:line 10 

理解任何想法。以下是我的代码...。

我的产品类:

Namespace Todd.Core 

    Public Class Product 
     Private _id As Guid 
     Private _name As String 
     Private _category As String 
     Private _discontinued As Boolean 

     Public Overridable Property Id() As Guid 
      Get 
       Return _id 
      End Get 
      Set(ByVal value As Guid) 
       _id = value 
      End Set 
     End Property 
     Public Overridable Property Name() As String 
      Get 
       Return _name 
      End Get 
      Set(ByVal value As String) 
       _name = value 
      End Set 
     End Property 
     Public Overridable Property Category() As String 
      Get 
       Return _category 
      End Get 
      Set(ByVal value As String) 
       _category = value 
      End Set 
     End Property 
     Public Overridable Property Discontinued() As Boolean 
      Get 
       Return _discontinued 
      End Get 
      Set(ByVal value As Boolean) 
       _discontinued = value 
      End Set 
     End Property 
    End Class 
End Namespace 

我Product.hbm.xml文件:

<?xml version="1.0" encoding="utf-8" ?> 
    <hibernate-mapping xmlns="urn:nhibernate-mapping-2.2"> 
    <class name="Todd.Core.Product, Todd.Core" table="Product"> 
    <id name="Id"> 
     <generator class="guid" /> 
    </id> 
    <property name="Name" /> 
    <property name="Category" /> 
    <property name="Discontinued" /> 
    </class> 
</hibernate-mapping> 

我的测试夹具:

Imports MbUnit.Framework 
Imports Todd.Core 

<TestFixture()> _ 
Public Class GenerateSchema_Fixture 

    <Test()> _ 
    Public Sub Can_generate_schema() 
     Dim cfg As New NHibernate.Cfg.Configuration 
     cfg.Configure() 
     cfg.AddAssembly(GetType(Todd.Core.Product).Assembly) 
     Dim exp As NHibernate.Tool.hbm2ddl.SchemaExport = New NHibernate.Tool.hbm2ddl.SchemaExport(cfg) 
     exp.Execute(True, True, False, True) 
    End Sub 

End Class 

我的app.config(从测试项目) :

<?xml version="1.0" encoding="utf-8" ?> 
<configuration> 
    <configSections> 
    <section name="hibernate-configuration" 
     type="NHibernate.Cfg.ConfigurationSectionHandler, NHibernate" /> 
    </configSections> 
    <hibernate-configuration xmlns="urn:nhibernate-configuration-2.2"> 
    <session-factory> 
     <property name="connection.provider">NHibernate.Connection.DriverConnectionProvider, NHibernate</property> 
     <property name="connection.connection_string">data source=.\SQLEXPRESS;Initial Catalog=NHibernateTestDB;Integrated Security=SSPI</property> 
     <property name="dialect">NHibernate.Dialect.MsSql2005Dialect</property> 
     <property name="show_sql">true</property> 
     <mapping assembly="Todd.Core" /> 
    </session-factory> 
    </hibernate-configuration> 
</configuration> 
+1

请格式化您的代码 – 2009-07-01 16:34:55

回答

0

该部分声明包含类声明和映射文件的程序集的名称。映射文件包含将POCO类映射到数据库表(或多个表)的元数据。

在另一方面你已经在你的 “GenerateSchema_Fixture” 得到

cfg.AddAssembly(GetType(Todd.Core.Product).Assembly) 

。这意味着NHibernate将加载包含在Assembly中的所有映射文件。

你必须决定以哪种方式为NHibernate提供信息。

如果您想以编程方式执行所有操作,我会申请使用FluentNHibernate。您通过流畅的界面声明所有内容,而不必考虑XML文件。 (fluentnhibernate.org)。