NHibernate тестирование, насмешка ISession - PullRequest
6 голосов
/ 15 января 2009

Я использую NHibernate и Rhinomocks и испытываю проблемы с тестированием того, что я хочу. Я хотел бы протестировать следующий метод хранилища, не обращаясь к базе данных (где _session внедряется в хранилище как 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();
    }
}

Мой первоначальный подход состоит в том, чтобы смоделировать ISession и вернуть заглушку IQueryable (закодированную вручную) при вызове Linq. У меня есть IList объектов Customer, которые я хотел бы запросить в памяти, чтобы проверить мой код запроса Linq, не нажимая на db. И я не уверен, как это будет выглядеть. Я пишу свою собственную реализацию IQueryable? Если так, кто-то сделал это для этого подхода? Или мне нужно посмотреть на другие пути?

Спасибо!

Ответы [ 2 ]

7 голосов
/ 16 января 2009

Как я сделал этот тест, чтобы не передавать выражение в хранилище, вместо этого выставить IQueryable, предоставив хранилищу интерфейс, такой как:

public interface IRepository<T>
{
    IQueryable<T> All();
    // whatever else you want
}

Легко реализуется так:

public IQueryable<T> All()
{
    return session.Linq<T>();
}

Это означает, что вместо вызова вашего метода в хранилище, как:

var result = repository.FindBy(x => x.Id == 1);

Вы можете сделать:

var result = repository.All().Where(x => x.Id == 1);

Или синтаксис LINQ:

var result = from instance in repository.All()
             where instance.Id == 1
             select instance;

Тогда это означает, что вы можете пройти тот же тест, напрямую отключив хранилище, что должно быть проще. Вы просто заставляете насмехаться, чтобы вернуть список, который вы создали и который вызвал AsQueryable ().

Как вы указали, суть этого в том, чтобы позволить вам проверить логику ваших запросов без использования базы данных, что значительно замедлит их.

0 голосов
/ 16 января 2009

С моей точки зрения это будет считаться интеграционным тестированием. NHibernate имеет свои собственные тесты, которые он проходит, и мне кажется, что вы пытаетесь дублировать некоторые из этих тестов в своем собственном тестовом наборе. Я либо добавлю код и тесты NHibernate в ваш проект и добавлю их туда вместе со своими тестами, то есть, если они не очень похожи, и использую их методы тестирования, либо перенесу это в сценарий тестирования интеграции и выберу базы данных.

Если это просто тот факт, что вам не нужно настраивать базу данных для проверки того, что вам повезло, поскольку вы используете NHibernate. При помощи некоторого поиска в Google вы можете найти немало примеров того, как использовать SQLite для «своего рода» тестирования интеграции с базой данных, но с сохранением его в памяти.

...