Использование Moq для макета репозитория, который возвращает IQueryable <MyObject> - PullRequest
34 голосов
/ 19 декабря 2010

Как мне настроить мой Moq, чтобы он возвращал некоторые значения, и при этом тестируемый сервис выбирает правильный?

IRepository:

public interface IGeographicRepository
{
    IQueryable<Country> GetCountries();
}

Сервис:

public Country GetCountry(int countryId)
{
    return geographicsRepository.GetCountries()
             .Where(c => c.CountryId == countryId).SingleOrDefault();
}

Тест:

    [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();
    }

Я в основном застрял в настройке.

Ответы [ 3 ]

64 голосов
/ 19 декабря 2010

Не могли бы вы использовать AsQueryable () ?

List<Country> countries = new List<Country>();
// Add Countries...
IQueryable<Country> queryableCountries = countries.AsQueryable();

geographicsRepository.Setup(x => x.GetCountries()).Returns(queryableCountries);
0 голосов
/ 05 января 2013

Я предлагаю не использовать AsQueryable (). он работает только с некоторыми простыми сценариями, прежде чем вы встретите некоторые специфические методы в вашем языке запросов ORM (Fetch, FetchMany, ThenFetchMany, Include, ToFuture и так далее).

Лучше использовать в базе данных памяти. Ссылка ниже описывает NHibernate Unit Testing.

Мы можем либо использовать стандартную СУБД, либо использовать базу данных в памяти, такую ​​как SQLite, чтобы получить очень быстрые тесты.

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

0 голосов
/ 19 декабря 2010

Что вы можете сделать, так это написать приватный вспомогательный метод, который сгенерирует IQueryable объектов Country и ваш макет вернет это.

[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();
}
...