在运行Fitnesse测试时映射组件时找不到程序集FluentHibernate



我遇到了一个非常奇怪的问题。我有几个正在工作的Fitnesse测试,它们将数据插入数据库,然后测试我的完整MVC应用程序堆栈。

当我试图将2个组件属性映射添加到实体映射时,我收到一个错误,说"找不到程序集'FluentHibernate…',这似乎有点神秘。

所有这些都是通过Fitnesse运行的,所以这可能是Fitnesse如何加载依赖项的问题。。。不过,我不知道是否能确定。我唯一知道的是,在添加2个"组件"映射之前,此代码运行良好。最重要的是,当这些代码通过普通的web应用程序运行时,这些映射运行良好(所以我知道"组件"映射和SessionFactory类在测试项目之外工作)。

有人知道我为什么会收到错误消息吗?请让我知道,如果有任何其他代码,我需要张贴。非常感谢您的帮助!

DLL版本:

  • NHibernate-3.3.1.4000
  • FluentHibernate-1.3.0.733
  • Fitnesse-v20111026
  • fitSharp-2.2.4498.25493

这是我的实体:

// namespace Reporting.Domain
public class Holdings
{
    public virtual int HoldingsId { get; set; }
    public virtual DateTime AsOfDate { get; set; }
    public virtual string Portfolio { get; set; }
    // need to add these next 2 properties!
    public virtual Balances PriorPeriod { get; set; }
    public virtual Balances CurrentPeriod { get; set; }
}

我的映射文件:

// namespace Reporting.Infrastructure
public sealed class HoldingsMap : ClassMap<Holdings>
{
    public HoldingsMap()
    {
        Id(x => x.HoldingsId).GeneratedBy.Identity();
        Map(x => x.AsOfDate).Not.Nullable();
        Map(x => x.Portfolio).Not.Nullable();
        // adding these lines eventually leads to the error
        Component(x=> x.PriorPeriod).ColumnPrefix("Prior");
        Component(x=> x.CurrentPeriod).ColumnPrefix("Current");
    }
}

我的SessionFactory(调用BuildSessionFactory时发生错误):

// namespace Reporting.Infrastructure
public class SessionFactory
{
    public ISessionFactory CreateSession(Action<Configuration> configurationFunction)
    {
        return CreateConfiguration().ExposeConfiguration(c => {}).BuildSessionFactory();
    }
    private FluentConfiguration CreateConfiguration()
    {
        var connectionString = "...";
        var msSqlConfiguration = MsSqlConfiguration.MsSql2008.ConnectionString(connectionString);
        var database = Fluently.Configure().Database(msSqlConfiguration);
        return database.Mappings(m => m.FluentMappings.AddFromAssemblyOf<SessionFactory>().Conventions.Add(ForeignKey.EndsWith("Id")));
    }
}

我得到这个堆栈跟踪:

__EXCEPTION__:System.Reflection.TargetInvocationException: Exception has been thrown by the target of an invocation. ---> FluentNHibernate.Cfg.FluentConfigurationException: An invalid or incomplete configuration was used while creating a SessionFactory. Check PotentialReasons collection, and InnerException for more detail.
 ---> FluentNHibernate.Cfg.FluentConfigurationException: An invalid or incomplete configuration was used while creating a SessionFactory. Check PotentialReasons collection, and InnerException for more detail.
 ---> System.Runtime.Serialization.SerializationException: Unable to find assembly 'FluentNHibernate, Version=1.3.0.733, Culture=neutral, PublicKeyToken=8aa435e3cb308880'.
   at System.Runtime.Serialization.Formatters.Binary.BinaryAssemblyInfo.GetAssembly()
   at System.Runtime.Serialization.Formatters.Binary.ObjectReader.GetType(BinaryAssemblyInfo assemblyInfo, String name)
   at System.Runtime.Serialization.Formatters.Binary.ObjectMap..ctor(String objectName, String[] memberNames, BinaryTypeEnum[] binaryTypeEnumA, Object[] typeInformationA, Int32[] memberAssemIds, ObjectReader objectReader, Int32 objectId, BinaryAssemblyInfo assemblyInfo, SizedArray assemIdToAssemblyTable)
   at System.Runtime.Serialization.Formatters.Binary.__BinaryParser.ReadObjectWithMapTyped(BinaryObjectWithMapTyped record)
   at System.Runtime.Serialization.Formatters.Binary.__BinaryParser.Run()
   at System.Runtime.Serialization.Formatters.Binary.ObjectReader.Deserialize(HeaderHandler handler, __BinaryParser serParser, Boolean fCheck, Boolean isCrossAppDomain, IMethodCallMessage methodCallMessage)
   at System.Runtime.Serialization.Formatters.Binary.BinaryFormatter.Deserialize(Stream serializationStream, HeaderHandler handler, Boolean fCheck, Boolean isCrossAppDomain, IMethodCallMessage methodCallMessage)
   at System.Runtime.Serialization.Formatters.Binary.BinaryFormatter.Deserialize(Stream serializationStream, HeaderHandler handler, Boolean fCheck, IMethodCallMessage methodCallMessage)
   at FluentNHibernate.Utils.Extensions.DeepClone[T](T obj)
   at System.Linq.Enumerable.WhereSelectListIterator`2.MoveNext()
   at System.Linq.Enumerable.FirstOrDefault[TSource](IEnumerable`1 source, Func`2 predicate)
   at FluentNHibernate.Visitors.ComponentReferenceResolutionVisitor.ProcessComponent(ReferenceComponentMapping mapping)
   at FluentNHibernate.MappingModel.ClassBased.ReferenceComponentMapping.AcceptVisitor(IMappingModelVisitor visitor)
   at FluentNHibernate.MappingModel.MappedMembers.AcceptVisitor(IMappingModelVisitor visitor)
   at FluentNHibernate.MappingModel.ClassBased.ClassMappingBase.AcceptVisitor(IMappingModelVisitor visitor)
   at FluentNHibernate.MappingModel.HibernateMapping.AcceptVisitor(IMappingModelVisitor visitor)
   at FluentNHibernate.Utils.CollectionExtensions.Each[T](IEnumerable`1 enumerable, Action`1 each)
   at FluentNHibernate.PersistenceModel.ApplyVisitors(IEnumerable`1 mappings)
   at FluentNHibernate.PersistenceModel.BuildMappings()
   at FluentNHibernate.PersistenceModel.Configure(Configuration cfg)
   at FluentNHibernate.Cfg.MappingConfiguration.Apply(Configuration cfg)
   at FluentNHibernate.Cfg.FluentConfiguration.BuildConfiguration()
   --- End of inner exception stack trace ---
   at FluentNHibernate.Cfg.FluentConfiguration.BuildConfiguration()
   at FluentNHibernate.Cfg.FluentConfiguration.BuildSessionFactory()
   --- End of inner exception stack trace ---
   at FluentNHibernate.Cfg.FluentConfiguration.BuildSessionFactory()
   at Reporting.Infrastructure.SessionFactory.CreateSession() in Reporting.InfrastructureSessionFactory.cs:line 32
   at Reporting.FitnesseTests.Database.Setup() in Reporting.FitnesseTestsDatabase.cs:line 23
   --- End of inner exception stack trace ---
   at fitSharp.Machine.Model.TypedValue.ThrowExceptionIfNotValid()
   at fitSharp.Slim.Operators.ExecuteCall.ExecuteOperation(Tree`1 parameters)
   at fitSharp.Slim.Operators.InvokeInstructionBase.Invoke(TypedValue instance, MemberName memberName, Tree`1 parameters)

FWIW,这就是我如何使用Fitnesse测试项目中的会话工厂:

// namespace Reporting.FitnesseTests
public class Database
{
    public static ISession Session { get; private set; }
    public static void Setup()
    {
        Session = new SessionFactory().CreateSession().OpenSession();
    }
}

我的Fitnesse Classpath是:

!path ..Reporting.FitnesseTestsbinDebugReporting.FitnesseTests.dll

尝试将测试要查找的DLL与fitsharp Runner.exe放在同一文件夹中。我遇到的一个问题是,在app.config中定义的.NET运行时依赖项是从执行进程的目录中解析的,在本例中,该目录可能是fitsharp所在的目录。显然有一种方法可以使用fitsharp套件配置文件来改变这种行为,但我还没能成功地让它工作(http://fitsharp.github.com/FitSharp/SuiteConfigurationFile.html)。

最新更新