Как правильно выполнить юнит-тестирование операций CRUD в репозитории? - PullRequest
9 голосов
/ 22 октября 2010

Поймите, это может звучать как широкий вопрос, поэтому позвольте мне уточнить. У меня есть репозиторий, представленный через интерфейс, с двумя конкретными реализациями - MockRepository и EntityFrameworkRepository .

Теперь у меня есть проект Unit-Test, для которого все тесты могут быть запущены для либо репозитория, путем пролистывания строки в [TestInitialize].

Мой вопрос в основном "Как мне писать тесты".

Вот что у меня есть:

C reate

// Arrange.
var foo = new Foo { .. };

// Act
Repository.Add(foo);
UnitOfWork.Commit();

// Assert
Assert.IsTrue(foo.Id > 0);

R etrieve

// Arrange.
var fooToGet = 1;

// Act
var foo = Repository.FindSingle(fooToGet);

// Assert
Assert.IsNotNull(foo);
Assert.AreEqual(foo.Id, fooToGet);

U pdate

// Arrange.
var fooToGet = 1;
var nameToChangeFooTo = "FooBar";

// Act
var foo = Repository.FindSingle(fooToGet);
foo.Name = nameToChangeFooTo;
UnitOfWork.Commit();
var fooRetrievedAgain = Repository.FindSingle(fooToGet);

// Assert
Assert.IsNotNull(foo);
Assert.AreEqual(fooRetrievedAgain.Id, fooToGet);
Assert.AreEqual(fooRetrievedAgain.Name, nameToChangeFooTo);

D elete

// Arrange.
var fooToGet = 1;

// Act
var foo = Repository.FindSingle(fooToGet);
Repository.Remove(foo);
UnitOfWork.Commit();
var fooRetrievedAgain = Repository.FindSingle(fooToGet);

// Assert
Assert.IsNull(fooRetrievedAgain);

Работает ок , для репозитория Mock и EF, но моя главная проблема - C (Create). Я не уверен, как проверить операцию добавления в моем репозитории. Это не не чувствуется правильным что я делаю.

Он подходит для репозитория EF, но чтобы пропустить его в моем репозитории Mock, мне пришлось использовать отражение для обновления идентификатора в коллекции в памяти (неприятно).

Итак - не могли бы вы поделиться некоторыми советами о том, как правильно тестировать операции CRUD в шаблоне репозитория?

Это приложение ASP.NET MVC, .NET 4, C #, Entity Framework 4 и шаблоны единиц работы / репозитория.

Спасибо.

EDIT

Просто, чтобы уточнить, ребята, это не все юнит-тесты, которые у меня есть. У меня есть модульные тесты для моего уровня обслуживания, а также тесты бизнес-правил.

Оба последних будут (и должны) потерпеть неудачу, если мои вышеупомянутые тесты репозитория не пройдут. В этом и заключается смысл, чтобы провести модульное тестирование самых основных операций моих репозиториев. Я не прав?

Ответы [ 2 ]

3 голосов
/ 22 октября 2010

Одним из вариантов является использование БД в памяти, такой как SqlLite, для проверки поведения ваших отображений, запросов и репозиториев.Это обсуждается Айенде здесь , хотя в его примере используется NHibernate.

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

2 голосов
/ 22 октября 2010

IMO, ваш тест создания должен:

  • добавить объект в хранилище
  • подтвердить, что ему присвоен идентификатор
  • извлечь вставленный объект с использованием идентификатора
  • сравните исходную сущность с сущностью чтения и убедитесь, что их свойства одинаковы

У меня есть много модульных тестов, подобных вашему, главное отличие в том, что я использую глубокуюметод сравнения для сравнения экземпляров объекта.Например, мои U-тесты выглядят так:

  • добавление объекта в хранилище
  • получение вставленной сущности с использованием идентификатора
  • изменение некоторых свойств объекта
  • обновить сущность в хранилище
  • получить обновленную сущность, используя идентификатор
  • сравнить обновленную сущность с прочитанной сущностью и убедиться, что их свойства одинаковы (вы можете определитьспецифическая логика для свойств, которые не могут быть обновлены)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...