Модульное тестирование Entity Framework - PullRequest
4 голосов
/ 10 июня 2011

Я только начал использовать Entity Framework (v4) и Linq.

У меня есть модель данных Entity, которая была сгенерирована из базы данных. Затем я реализовал классы хранилища для реализации бизнес-логики для моих сущностей, и они содержат мои запросы LINQ для взаимодействия с сущностями / базой данных.

Какой самый простой и простой способ для модульного тестирования методов / функций в моих классах репозитория без попадания в базу данных?

Ответы [ 4 ]

3 голосов
/ 10 июня 2011

Вы можете запустить свои тесты с базой данных памяти. Проверьте этот вопрос

1 голос
/ 10 июня 2011

Я предполагаю, что вам просто не нужно загружать / сохранять какие-либо объекты в вашем тесте (то есть: тестировать только свою бизнес-логику, а не уровень персистентности). В этом случае вам понадобится способ сгенерировать (и повторно использовать) тестовые «заглушки». Самый простой способ - создать фабрики для ваших различных сущностей, которые возвращают некоторые простые (но значимые) сущности.

Например, если вы тестировали свой пользовательский движок, вы можете захотеть иметь фабрику тестирования, которая генерирует пользователей разных типов, например, пользователя из Висконсина, или пользователя с очень длинной фамилией, или пользователя без друзья, против пользователя с 100 друзьями и т. д.

public static class UserStubFactory {
    static User NewUserWithLongLastName(int letterCount) {  //return user with long last name  }
    static User NewUserWithXFriends(int count) { //return user w/ X friends }
}

Затем, когда вы создадите другие фабрики тестовых заглушек, вы можете начать объединять их в цепочку. Поэтому, возможно, вы захотите протестировать пользователя с длинной фамилией, а затем провести его через некоторые другие действия в вашей системе. Что ж, теперь у вас уже есть TestStub, так что вы можете просто вызвать NewUserWithLongLastName () и передать его через ваш движок.

Если вы не используете этот метод, вы также можете просто создать их на лету с помощью синтаксиса конструктора.

User newUser = new User() {  LastName ="HOLYCOWTHISISAVERYYLONGLASTNAME"; }

но я предпочитаю фабрики за коэффициент повторного использования.

1 голос
/ 10 июня 2011

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

В вашем рабочем коде вы передаете IDbSet от реального DbContext;в своем тестовом коде вы передаете эту заглушку.

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

1 голос
/ 10 июня 2011

Найдите фреймворк, который позволит вам создать репозиторий макетов.В начале это займет время, но окупится в долгосрочной перспективе.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...