Dopo l'aggiornamento a Castello di Tronco e NHibernate 2.1.0.4000 mio incidente test di integrazione TestDriven.Net
-
11-09-2019 - |
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?
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.