3

我遇到了一個非常奇怪的問題。我有幾個在數據庫中插入數據的Fitnesse測試,然後測試我的完整MVC應用程序堆棧。運行Fitnesse測試時映射組件時無法找到裝配體FluentNHibernate

當我嘗試2名組件屬性映射添加到我的實體地圖,我得到一個錯誤說「無法找到程序集‘FluentNHibernate ......’這似乎有點神祕。

所有這一切都正在通過運行Fitnesse,所以這可能是Fitnesse加載依賴關係的一個問題......但我並不知道確切的知道,但我知道的唯一的事情是,這個代碼運行良好,直到我添加了2個「Component」映射。這些映射運行良好時,通過正常的Web應用程序運行此代碼(所以我知道「組件」映射和SessionFactory類工程以外的測試項目)

有沒有人有任何想法,爲什麼我無ld得到我收到的錯誤信息?請讓我知道是否有任何其他代碼需要發佈。任何幫助是極大的讚賞!

DLL版本:

  • NHibernate的 - 3.3.1.4000
  • FluentNHibernate - 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.Infrastructure\SessionFactory.cs:line 32 
    at Reporting.FitnesseTests.Database.Setup() in Reporting.FitnesseTests\Database.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的類路徑是:

!path ..\Reporting.FitnesseTests\bin\Debug\Reporting.FitnesseTests.dll 

回答

3

嘗試把測試正在尋找這些DLL在與fitharp Runner.exe相同的文件夾中。我碰到的一個問題是,在app.config中定義的.NET運行時依賴關係是從執行進程的目錄解決的,在這個目錄中可能是fitharp駐留的目錄。顯然有一種方法可以使用fitsharp套件配置文件來改變這種行爲,但是我一直無法使它成功運行(http://fitsharp.github.com/FitSharp/SuiteConfigurationFile.html)。

+0

聖牛...它的工作!現在我只需要弄清楚是否有方法來配置它! – 2012-08-10 19:44:49

相關問題