¿O es mejor usar otro patrón de diseño?¿Cómo puedo probar una clase de Singleton con DUnit?
Respuesta
Respondido a una pregunta similar hace unos días here, mocking a Singleton. La publicación original es para C# .Net en lo que respecta a la burla del comportamiento de un singleton, pero aún debe aplicarse.
En cuanto al patrón singleton, no tiene nada de malo, en muchos casos queremos centralizar la lógica y los datos. Sin embargo, hay una gran diferencia entre una clase única y una estática. Al crear su singleton como una clase estática, los códigos duros se implementan para cada consumidor en su aplicación, lo que hace que las pruebas unitarias sean muy difíciles.
Lo que quiere hacer es definir una interfaz para su singleton, exponiendo los métodos para que los consumidores utilicen. Sus consumidores a su vez son pasaron una referencia a una clase implementadora por quien los crea [normalmente esta es su aplicación, o un contenedor si está familiarizado con Dependency Injection \ Inversion of Control].
Es este marco, el que está creando instancias de los consumidores, el responsable de garantizar que una sola instancia esté flotando. Realmente no es un gran salto de la clase estática a la referencia de interfaz [como se demostró en el enlace anterior], simplemente se pierde la conveniencia de una instancia accesible a nivel mundial - sé que sé, las referencias globales son terriblemente seductoras, pero Luke le dio la espalda al Lado oscuro, ¡tú también puedes!
En términos generales, las mejores prácticas sugieren evitar referencias estáticas y fomentan los programas contra las interfaces. Recuerde, todavía es posible aplicar el patrón Singleton con estas restricciones. Siga estas pautas, y no debería tener ningún problema para probar la unidad de su trabajo :)
Espero que esto ayude!
Singleton! = Pública clase estática, en lugar Singleton == única instancia
I'm using the following pattern cuando escribo unos únicos basados en estáticas que puedo simulado. El código es Java, pero creo que tendrás una idea. El problema principal con este enfoque es que tiene que relajar el constructor con el paquete protegido (que sorta derrota a un singleton verdadero). Como nota al margen: el código se aplica a la capacidad de burlarse de su código "estático" no necesariamente simplemente llamándolo
La falta de capacidad de prueba es una de las mayores caídas del modelo Singleton clásico (método de clase estática que devuelve una instancia). En lo que a mí respecta, eso es justificación suficiente para rediseñar cualquier código que use Singletons para usar algún otro diseño.
Si necesita absolutamente tener una instancia singular, la Inyección de Dependencia y la escritura en una interfaz, como lo sugiere johnny g, es definitivamente el camino a seguir.
Si debe usar un singleton (y hay razones para hacerlo ... pero siempre trataré de evitarlo si es posible). Yo recomendaría usar un contenedor IOC para administrarlo. No estoy seguro si hay uno para Delphi o no. Pero en Java puedes usar Spring, en .NET puedes usar Windsor/Castle. Un contenedor de IOC puede contener Singleton y puede registrar diferentes implementaciones para probar.
Es probable que sea un tema demasiado grande para entrar aquí más allá de este fragmento.
Por lo general, solo uso Singletons para objetos Flyweight u objetos de valor similar. Ver en un contenedor IoC (como se discutió anteriormente) es probablemente una mejor manera de manejar un objeto compartido que un singleton.
considerar que en Smalltalk (donde muchos de estos patrones se originó), verdadero y falso eran los dos únicos efectivamente :)
- 1. ¿Cómo puedo probar métodos privados con DUnit?
- 2. ¿Cómo puedo implementar una clase singleton abstracta en Java?
- 3. ¿Cómo puedo implementar una clase singleton en Perl?
- 4. StructureMap: ¿Cómo puedo probar la clase de registro?
- 5. ¿Cómo probar la unidad Singleton class - C++?
- 6. Creando una clase singleton con dispatch_once para clase hiearchy
- 7. DUnit: ¿Cómo ejecutar pruebas?
- 8. clase estática vs clase singleton
- 9. C#: Cómo probar una clase de trabajador con subprocesos básicos
- 10. ¿Cómo puedo probar los servlets con JUnit?
- 11. ¿Cómo puede una clase singleton usar una interfaz?
- 12. La extensión de una clase Singleton
- 13. Establecer @property de una clase Singleton
- 14. Singleton clase en Flex
- 15. clase estática y singleton
- 16. Prueba DUnit GUI: ¿Puedo forzar 'Aplicación' a una "forma" diferente?
- 17. ¿Cómo puedo probar una función de orden superior con QuickCheck?
- 18. Con 2 servidores web, ¿una clase singleton tendrá 2 instancias?
- 19. clase Singleton en java
- 20. Cómo crear una clase Singleton de proceso cruzado en Java
- 21. ¿Cómo marco una clase como singleton en UML?
- 22. ¿Está extendiendo una clase singleton incorrecta?
- 23. ¿Cómo puedo probar una publicación HTTP con Moq en ASP.NET?
- 24. 'Miembro protegido en clase sellada' advertencia (una clase singleton)
- 25. ¿Dónde puedo encontrar una introducción al uso de DUnit con Delphi 2007 o posterior?
- 26. ¿Cómo puedo habilitar el seguimiento de fuga de memoria con FastMM en DUnit?
- 27. Force Singleton Pattern en una clase que implementa una interfaz
- 28. Cómo probar métodos de clase en RSPEC
- 29. ¿Cómo puedo probar el código del socket con PHPUnit?
- 30. ¿Cómo puedo probar ModelState?
... en relación con Smalltalk: sí, pero verdadero y falso son _so_ comprobable :) – mjn