Prueba NHibernate, burlando ISession
mocking iqueryable (2)
Desde mi punto de vista, esto se consideraría Prueba de integración. NHibernate tiene sus propias pruebas que aprueba y me parece que intentas duplicar algunas de esas pruebas en tu propio banco de pruebas. Añadiría el código y las pruebas de NHibernate a su proyecto y lo agregaría allí junto con sus pruebas, eso si no tienen uno muy similar, y usaría sus métodos de prueba o movería esto a un escenario de prueba de integración y presionaría el base de datos.
Si es solo el hecho de que no desea tener que configurar una base de datos para probar, tiene suerte ya que está usando NHibernate. Con algunos google puedes encontrar bastantes ejemplos de cómo usar SQLite para hacer "un poco" pruebas de integración con la base de datos pero mantenerlas en la memoria.
Estoy usando NHibernate y Rhinomocks y tengo problemas para probar lo que quiero. Me gustaría probar el siguiente método de repositorio sin tocar la base de datos (donde _session se inyecta en el repositorio como ISession):
public class Repository : IRepository
{
(... code snipped for brevity ...)
public T FindBy<T>(Expression<Func<T, bool>> where)
{
return _session.Linq<T>().Where(where).FirstOrDefault();
}
}
Mi enfoque inicial es simular ISession y devolver un código auxiliar IQueryable (codificado a mano) cuando se llama a Linq. Tengo un IList de objetos de Cliente que me gustaría consultar en memeory para probar mi código de consulta Linq sin presionar el db. Y no estoy seguro de cómo se vería esto. ¿Escribo mi propia implementación de IQueryable? Si es así, ¿alguien ha hecho esto para este enfoque? ¿O necesito mirar otras avenidas?
¡Gracias!
La forma en que realicé esta prueba es no pasar la expresión al repositorio, sino exponer IQueryable dando al repositorio una interfaz como:
public interface IRepository<T>
{
IQueryable<T> All();
// whatever else you want
}
Implementado fácilmente de esta manera:
public IQueryable<T> All()
{
return session.Linq<T>();
}
Esto significa que en lugar de llamar a su método en el repositorio como:
var result = repository.FindBy(x => x.Id == 1);
Tu puedes hacer:
var result = repository.All().Where(x => x.Id == 1);
O la sintaxis de LINQ:
var result = from instance in repository.All()
where instance.Id == 1
select instance;
Esto significa que puede obtener la misma prueba burlándose directamente del repositorio, lo que debería ser más fácil. Acaba de obtener el simulacro para devolver una lista que ha creado y llamó a AsQueryable ().
Como ha señalado, el objetivo de esto es permitirle probar la lógica de sus consultas sin involucrar a la base de datos, lo que las ralentizaría dramáticamente.