unit testing - test - Usar Moq para simular un repositorio que devuelve IQueryable<MyObject>
setup mock c# (3)
¿No podrías usar AsQueryable () ?
List<Country> countries = new List<Country>();
// Add Countries...
IQueryable<Country> queryableCountries = countries.AsQueryable();
geographicsRepository.Setup(x => x.GetCountries()).Returns(queryableCountries);
¿Cómo configuro mi Moq para devolver algunos valores y hacer que el servicio probado seleccione el correcto?
IRepository:
public interface IGeographicRepository
{
IQueryable<Country> GetCountries();
}
Servicio:
public Country GetCountry(int countryId)
{
return geographicsRepository.GetCountries()
.Where(c => c.CountryId == countryId).SingleOrDefault();
}
Prueba:
[Test]
public void Can_Get_Correct_Country()
{
//Setup
geographicsRepository.Setup(x => x.GetCountries()).Returns()
//No idea what to do here.
//Call
var country = geoService.GetCountry(1);
//Should return object Country with property CountryName="Jamaica"
//Assert
Assert.IsInstanceOf<Country>(country);
Assert.AreEqual("Jamaica", country.CountryName);
Assert.AreEqual(1, country.CountryId);
geographicsRepository.VerifyAll();
}
Básicamente estoy atrapado en la configuración.
Lo que puedes hacer es escribir un método de ayuda privada que generará un IQueryable
de objetos Country y hará que tu simulación lo devuelva.
[Test]
public void Can_Get_Correct_Country()
{
// some private method
IQueryable<Country> countries = GetCountries();
//Setup
geographicsRepository.Setup(x => x.GetCountries()).Returns(countries);
//Should return object Country with property CountryName="Jamaica"
//Call
var country = geoService.GetCountry(1);
//Assert
Assert.IsInstanceOf<Country>(country);
Assert.AreEqual("Jamaica", country.CountryName);
Assert.AreEqual(1, country.CountryId);
geographicsRepository.VerifyAll();
}
Sugiero que no use AsQueryable (). solo funciona con algunos escenarios simples antes de conocer algunos métodos específicos en su lenguaje de consulta ORM (Fetch, FetchMany, ThenFetchMany, Include, ToFuture, etc.).
Es mejor usarlo en la base de datos de memoria. El siguiente enlace describe NHibernate Unit Testing.
Podemos utilizar un RDBMS estándar o utilizar una base de datos en memoria como SQLite para obtener pruebas muy rápidas.