NHibernate:如何从单元测试项目中引用主项目的程序集?

时间:2014-07-03 13:03:54

标签: c# unit-testing nhibernate reflection

我构建了一个简单的NHibernate Application,但我想使用Mapping Attributes而不是Mapping XML。

现在我遇到了问题,当我创建一个单元测试项目并希望加载映射属性时,我的域对象在另一个项目中!

这是我的单元测试:

using System;
using Microsoft.VisualStudio.TestTools.UnitTesting;
using NHibernate.Cfg;
using NHibernate.Tool.hbm2ddl;

namespace Tests
{
[TestClass]
public class UnitTest1
{
    [TestMethod]
    public void TestMethod1()
    {
        Configuration cfg = new Configuration();
        cfg.Configure();
        cfg.AddInputStream(NHibernate.Mapping.Attributes.HbmSerializer.Default.Serialize(
            System.Reflection.Assembly.GetExecutingAssembly()));
        new SchemaExport(cfg).Execute(false, true, false);
    }
}

在这一行

cfg.AddInputStream(NHibernate.Mapping.Attributes.HbmSerializer.Default.Serialize(
            System.Reflection.Assembly.GetExecutingAssembly()));

我得到了这个例外:

Result Message: 
Test method Tests.UnitTest1.TestMethod1 threw exception: 
NHibernate.Mapping.Attributes.MappingException: The following assembly contains 
no mapped classes: Tests, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null
Result StackTrace:  
at NHibernate.Mapping.Attributes.HbmSerializer.Serialize(Stream stream, Assembly assembly)
   at NHibernate.Mapping.Attributes.HbmSerializer.Serialize(Assembly assembly)
   at Tests.UnitTest1.TestMethod1() in ...Tests\UnitTest1.cs:Line 17.

我想而不是

System.Reflection.Assembly.GetExecutingAssembly()

我必须以某种方式得到我的主要项目的组装。

2 个答案:

答案 0 :(得分:2)

我发现最简单的方法是:

Assembly.Load("Project Name of Desired Assembly")

我在线阅读了很多内容,包括这篇文章,没有什么比使用这种方法更简单了。此外,JoelC提到的方法可能有用,但我不能让它为我工作,这没有任何问题。

答案 1 :(得分:1)

是的,从单元测试中调用System.Reflection.Assembly.GetExecutingAssembly()通常会将单元测试运行器作为执行程序集。

您应该可以致电typeof([TargetAssemblyClass]).Assembly查找主项目组合。当然,这需要参考我希望你已经拥有的主要项目。

编辑: 调用System.Reflection.Assembly.GetAssembly(typeof([TargetAssemblyClass]))是实现同样目标的另一种方式。