Estoy trabajando en un código de biblioteca alrededor de IDisposable
. La ruta administrada (a través de using
) es fácilmente comprobable. Sin embargo, me estoy preguntando acerca del finalizador: ¿Es suficiente llamar al System.GC.Collect()
para forzar la ejecución del finalizador?¿Cómo puedo probar la unidad? ¿Es descartable?
Respuesta
No, el GC.Collect() es asíncrono, también tendría que llamar a esto:
System.GC.WaitForPendingFinalizers();
¡Muchas gracias! Sabía por qué pregunté :-) –
Creo que GC.Collect() en sí mismo es sincrónico (es decir, habrá liberado cualquier memoria que puede en el momento en que vuelve) pero los finalizadores se ejecutan por separado. Sin embargo, podría estar completamente equivocado ... –
Estoy haciendo las dos cosas ahora y la prueba pasó cada tim mi. Es decir, llamado punto de extensión correcto desde el finalizador. –
¿Podrías burlarse de una interfaz IDisposable
y esperar una llamada al Dispose
? Eso al menos te permitiría ver cuando el objeto está realmente dispuesto.
Establecer un punto de interrupción es suficiente para descubrirlo. Sin embargo, estoy probando la implementación de Dispose(), no si se llama. –
creo que me incline hacia la fabricación Finalizar() llamar a otro método, y la prueba de que el otro método hace lo que quiere. No obtendría una cobertura de código del 100%, pero al menos sabría que el método libera los recursos del objeto correctamente.
Me gustaría echar un vistazo a Dispose, Finalization, and Resource Management es la mejor referencia sobre el tema que conozco. El uso de su patrón:
~ComplexCleanupBase()
{
Dispose(false);
}
public void Dispose()
{
Dispose(true);
GC.SuppressFinalize(this);
}
protected override void Dispose(bool disposing)
{
if (!disposed)
{
if (disposing)
{
// dispose-only, i.e. non-finalizable logic
}
// new shared cleanup logic
disposed = true;
}
base.Dispose(disposing);
}
, terminamos con métodos simples muertos finalizador/Dispose() y un Desechar comprobable (bool). No es necesario forzar la finalización ni nada con la clase GC.
Sí, lo estoy haciendo bastante así. Es solo una pequeña adaptación de lo que se recomienda en MSDN. –
- 1. ¿Cómo puedo probar la unidad GC?
- 2. ¿Cómo probar la unidad?
- 3. ¿Cómo probar la unidad NSCoding?
- 4. ¿Cómo puedo probar la unidad de mis migraciones de FluentMigrator?
- 5. ¿Cómo puedo probar la unidad de un controlador Symfony2?
- 6. ¿Cómo puedo probar la unidad de un servicio de Windows?
- 7. ¿Cómo puedo probar la unidad de un MVC UserViewControl?
- 8. ¿Cómo puedo probar la unidad correctamente mi DAL?
- 9. ¿Cómo puedo probar la unidad con jazmín y navegar?
- 10. ¿Cómo puedo probar la unidad de algo que utiliza VisualTreeHelper?
- 11. ¿Cómo puedo probar la unidad First Framework Code First Mappings?
- 12. ¿Cómo probar la unidad de su API?
- 13. Cómo probar la unidad de análisis JSON
- 14. Cómo probar las subclases de la unidad
- 15. Cómo probar la unidad HtmlHelper con Moq?
- 16. ¿Cómo probar la unidad Singleton class - C++?
- 17. ¿Cómo puedo probar la unidad si mi objeto es realmente serializable?
- 18. ¿Es posible probar la unidad BundleConfig en MVC4?
- 19. ¿Puedo probar la unidad una función interna en python?
- 20. EF4: ¿es posible simular ObjectContext para probar la unidad?
- 21. ¿Es importante probar la unidad de un constructor?
- 22. Cómo probar las clases abstractas de unidad
- 23. Usar Clojure para probar la unidad Java
- 24. Cómo probar la lógica de la unidad en jsp?
- 25. Cómo probar la unidad de lógica de devolución de llamada?
- 26. Cómo probar la unidad qt gráficos ver widgets/elementos
- 27. Cómo probar la unidad con diferentes configuraciones en Django?
- 28. ¿Cómo puedo probar la membresía de Asp.net?
- 29. Cómo probar el código sincronizado de la unidad
- 30. ¿Cómo probar las reglas comerciales de la unidad?
Si se apega al patrón prescrito para IDisposable, estoy seguro de que la prueba de la unidad va a ser tan útil. –
lo siento, debería haber sido "No estoy seguro de que la unidad de prueba va a ser tan útil ... –
@Mitch: implementar IDisposable correctamente, por lo que los recursos gestionados y no administrados se eliminan en el momento adecuado no es trivial Como el código de la biblioteca en cuestión es responsable de exactamente eso, no veo un punto en _not_ que pruebe ... –