2010-08-26 21 views
6

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

11

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.

3

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 :)

+0

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

Cuestiones relacionadas