Dopo l'aggiornamento a Castello di Tronco e NHibernate 2.1.0.4000 mio incidente test di integrazione TestDriven.Net

StackOverflow https://stackoverflow.com/questions/1832394

Domanda

Ho un vecchio monorotaia / ActiveRecord Ho fatto un po 'di lavoro anche.

Recentemente ho deciso di aggiornare l'applicazione al Castello di Tronco e NHibernate 2.1.0.4000 GA e ora sto trovando un paio di problemi con l'esecuzione di test:

Prima di tutto - Quando si utilizza TestDriven.Net per eseguire i test di integrazione che funzionano contro il database, è schiantarsi TestDriven.Net tutto, o tutti i test completa esecuzione, quindi TestDriven.Net si blocca. Questo non è mai successo prima dell'aggiornamento.

Quando TestDriven.NET crash, ecco cosa viene scritto nel registro eventi:

  

secchio Fault 1467169527, tipo 1   Nome evento: APPCRASH   Risposta: Non disponibile   Cab Id: 0

     

Firma problema:   P1: ProcessInvocation86.exe   P2: 2.22.2468.0   P3: 4a26845c   P4: KERNELBASE.dll   P5: 6.1.7600.16385   P6: 4a5bdbdf   P7: e053534f   P8: 0000b727   P9:   P10:

La seconda cosa - Le eccezioni vengono registrati quando le classi proxy sono in corso Finalize () 'd, come di seguito -. Sembra essere una volta che questo viene registrato un paio di volte, cioè quando TestDriven.Net crash

Ecco la traccia dello stack per l'eccezione:

NHibernate.LazyInitializationException:     
Initializing[MyApp.Core.Models.TestExecutionPackage#15d9eb96-faf0-4b4b-9c5c-9cd400065430]-Could not initialize proxy - no Session.
  at NHibernate.Proxy.AbstractLazyInitializer.Initialize()
  at NHibernate.Proxy.AbstractLazyInitializer.GetImplementation()
  at NHibernate.ByteCode.Castle.LazyInitializer.Intercept(IInvocation invocation)
  at Castle.DynamicProxy.AbstractInvocation.Proceed()
  at Castle.Proxies.TestExecutionPackageProxy.Finalize()

Lo stesso comportamento anche in crash MsBuild sul nostro CI server.

La cosa veramente strana è che in teoria le eccezioni sollevate in Finalize () devono essere ingerite come per la documentazione MSDN:

http: // MSDN. microsoft.com/en-us/library/system.object.finalize(VS.71).aspx

Se Finalizza o un override di Finalizza genera un'eccezione, il runtime ignora l'eccezione, termina che Finalizza metodo, e continua la finalizzazione processo.

I pensieri chiunque?

È stato utile?

Soluzione

non arrivò mai fino in fondo di questo problema, ma ho fatto finire per l'attuazione di un lavoro, piuttosto rudimentale intorno creando la mia propria implementazione LazyInitializer, dove ho assegno per il metodo Finalize su invoke, come illustrato di seguito:

/// <summary>
/// Invoke the actual Property/Method using the Proxy or instantiate the actual
/// object and use it when the Proxy can't handle the method. 
/// </summary>
/// <param name="invocation">The <see cref="IInvocation"/> from the generated Castle.DynamicProxy.</param>
public virtual void Intercept(IInvocation invocation)
{
  try
  {
    if (invocation.Method.Name == "Finalize")
    {
      return;
    }
    if (_constructed)
    {
      // let the generic LazyInitializer figure out if this can be handled
      // with the proxy or if the real class needs to be initialized
      invocation.ReturnValue = base.Invoke(invocation.Method, invocation.Arguments, invocation.Proxy);

      // the base LazyInitializer could not handle it so we need to Invoke
      // the method/property against the real class
      if (invocation.ReturnValue == InvokeImplementation)
      {
        invocation.ReturnValue = invocation.Method.Invoke(GetImplementation(), invocation.Arguments);
        return;
      }
      else
      {
        return;
      }
    }
    else
    {
      // TODO: Find out equivalent to CGLIB's 'method.invokeSuper'.
      return;
    }
  }
  catch (TargetInvocationException tie)
  {
    // Propagate the inner exception so that the proxy throws the same exception as
    // the real object would 
    Exception_InternalPreserveStackTrace.Invoke(tie.InnerException, new Object[] { });
    throw tie.InnerException;
  }
}

Altri suggerimenti

Ho avuto lo stesso problema quando un ho migrato a 2.1.2 versione di NHibernate. Ho cambiato Castello Linfu Proxy e poi tutto ha funzionato bene per me. Spero che questo aiuti.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top