Tengo un método en mi capa de acceso a datos que realiza la asignación. El método acepta un DataReader y asigna los datos a las propiedades del objeto de dominio adecuado. ¿Hay alguna manera de simular de algún modo el DataReader para poder realizar pruebas unitarias en los métodos de mapeo sin golpear contra una base de datos física?Cómo simular DataReader para probar la unidad DAL
Respuesta
Suerte para ti, DataReader
implementa la interfaz IDataReader
.
En lugar de confiar en un DataReader
en su código, use IDataReader
. Luego, en sus pruebas puede sustituir su propia implementación que devuelve datos ficticios, o utilizar un marco de burla como Rhino.Mocks o similar para crear los talones y asignar valores devueltos.
Dependiendo de cómo esté "recibiendo" el DataReader
en su código, es posible que deba hacer una pequeña refactorización. Lo que desea es tener dependencias externas como esta "inyectadas" en el constructor (preferido) o a través de una propiedad, para que los consumidores de la clase puedan sustituir cualquier implementación de IDataReader
. (Esta sustitución también es la razón por la que declara sus parámetros/propiedades como abstracciones en lugar de tipos concretos). Esto se conoce como Dependency Injection, una forma de Inversion of Control.
Sí, no use DataReader
pero IDataReader o IDataRecord, luego haga una mofa lo que desee.
En caso de que quiera simular el IDataReader para devolver una lista de registros, puede crear una clase que implemente IDataReader y anule algunos de sus métodos (como Read() y Indexer). Además, necesitaría una variable para mantener el registro de la fila actual y una variable para mantener los valores de la lista. A continuación se muestra el código de ejemplo para hacer esto:
public class MockDataReader : IDataReader
{
private int _rowCounter = 0;
private List<Dictionary<string,object>> _records = new List<Dictionary<string,object>>();
public MockDataReader(List<Dictionary<string,object>> records)
{
_records = records;
}
public bool Read()
{
_rowCounter++;
if (_rowCounter < _records.Count) return true;
return false;
}
public object this[string name]
{
get { return _records[_rowCounter][name]; }
}
}
Luego de hacer uso de esta clase, se puede utilizar el siguiente código:
var itemsList = new List<Dictionary<string, object>>();
for (int i = 0; i < 5; i++)
{
var num = i + 1;
var items = new Dictionary<string, object>();
items.Add("Id", num);
items.Add("FirstName", "MyFirstName" + num);
items.Add("LastName", "MyLastName" + num);
itemsList.Add(items);
}
var result = new MockDataReader(itemsList);
No es una manera plena prueba, pero funciona. Espero que ayude :)
- 1. ¿Cómo puedo probar la unidad correctamente mi DAL?
- 2. EF4: ¿es posible simular ObjectContext para probar la unidad?
- 3. ¿Cómo probar la unidad?
- 4. ¿Cómo probar la unidad NSCoding?
- 5. Usar Clojure para probar la unidad Java
- 6. Cómo probar las subclases de la unidad
- 7. ¿Cómo probar la unidad de su API?
- 8. Cómo probar la unidad HtmlHelper con Moq?
- 9. ¿Cómo puedo probar la unidad GC?
- 10. ¿Cómo puedo probar la unidad? ¿Es descartable?
- 11. Cómo probar la unidad de análisis JSON
- 12. ¿Cómo probar la unidad Singleton class - C++?
- 13. ¿Cómo puedo probar la unidad de algo que utiliza VisualTreeHelper?
- 14. Cómo probar la unidad con diferentes configuraciones en Django?
- 15. Cómo probar la unidad de lógica de devolución de llamada?
- 16. ¿Cómo puedo simular correctamente mi controladorcontexto para probar ViewResult.ExecuteResult()?
- 17. ¿Cómo probar/simular conexiones simultáneas para un sitio web?
- 18. ¿Qué debo hacer para probar esta unidad?
- 19. Usa Scala para probar la unidad de Java?
- 20. Cómo simular SqlParameterCollection usando Moq
- 21. NoSQL - ¿Cómo simular la base de datos para pruebas unitarias?
- 22. Cómo probar la lógica de la unidad en jsp?
- 23. Cómo probar las clases abstractas de unidad
- 24. ¿Cómo se usa la inyección de resorte para probar la unidad de un controlador?
- 25. ¿Cómo puedo probar las acciones sin simular que utilizan UpdateModel?
- 26. ¿Qué usa para probar la unidad de su IU web?
- 27. ¿Cómo debería una unidad probar un controlador .NET MVC?
- 28. ¿Cómo puedo probar la unidad First Framework Code First Mappings?
- 29. ¿Cómo puedo probar la unidad de un controlador Symfony2?
- 30. ¿Cómo probar las reglas comerciales de la unidad?
No crearía la clase real para simular 'IDataReader', pero +1 para mostrar lo que necesita para configurar su objeto de simulación para implementarlo. – krillgar