Модульное тестирование кода репозитория EF4 - PullRequest
0 голосов
/ 20 сентября 2011

Какой хороший подход для написания модульных тестов для следующего метода GetMyObjectsFiltered(...) в репозитории EF4:

public static class MyRepository
{
    public static List<MyObject> GetMyObjectsFiltered(string searchFilter)
    {
        var myQueryableObjects = GetMyObjects(searchFilter);

        if (false == string.IsNullOrWhiteSpace(searchFilter))
        {
            myQueryableObjects = myQueryableObjects.Where(o => o.MyProperty.Contains(searchFilter));
        }

        return myQueryableObjects.ToList();
    }

    private static IQueryable<MyObject> GetMyObjects(string searchFilter)
    {
        using (MyDB_ModelContainer model = new MyDB_ModelContainer())
        {
            return model.MyTable.AsQueryable();
        }
    }

}

Могу ли я ввести MyDB_ModelContainer и по-прежнему использовать оператор using?

Ответы [ 3 ]

2 голосов
/ 20 сентября 2011

ну что за ирония, которую вы спрашиваете о модульном тестировании, и у вас тут есть статический метод ..

Прочтите это: Статические методы - смерть для проверяемости

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

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

Я бы посоветовал вам взглянуть на фальшивые рамки вроде moq .

Поскольку у него есть бизнес-логика, вы, вероятно, можете перенести ее в отдельный класс, который представляет то, что он делает. тогда ваш репозиторий все еще может быть интерфейсом, но вы будете выводить данные, которые будут использоваться вашим новым классом.

1 голос
/ 20 сентября 2011

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

0 голосов
/ 23 сентября 2011

В конце я реорганизовал статический класс и сделал очень тонкий слой поверх EF, который возвращает только типы IQueryable.Реализованный через интерфейс, этот класс может быть легко задан с помощью Moles .Полное описание приведено в следующем сообщении:

...