unit test setup objetos mock ejemplo unit-testing nunit moq

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.

http://ayende.com/blog/3983/nhibernate-unit-testing