Поймите, это может звучать как широкий вопрос, поэтому позвольте мне уточнить. У меня есть репозиторий, представленный через интерфейс, с двумя конкретными реализациями - 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 Repository, но чтобы он прошел в моем Mock Repository, мне пришлось использовать отражение для обновления идентификатора в коллекции в памяти (неприятно).
Итак, не могли бы вы поделиться некоторыми советами о том, как правильно тестировать операции CRUD в шаблоне репозитория?
Это приложение ASP.NET MVC, .NET 4, C #, Entity Framework 4 и шаблоны единиц работы / репозитория.
Благодарю.
РЕДАКТИРОВАТЬ
Просто, чтобы уточнить, ребята, это не все юнит-тесты, которые у меня есть. У меня есть модульные тесты для моего уровня обслуживания, а также тесты бизнес-правил.
Оба последних будут (и должны) потерпеть неудачу, если мои вышеуказанные тесты репозитория не пройдут. Вот в чем смысл, чтобы провести модульное тестирование самых основных операций моих репозиториев. Я ошибся?
Одним из вариантов является использование БД в памяти, такой как SqlLite, для проверки поведения ваших отображений, запросов и репозиториев. Это обсуждается Айенде здесь , хотя в его примере используется NHibernate.
Другой вариант, который, кажется, решает вашу непосредственную задачу по настройке идентификаторов объектов домена, заключается в использовании тестовых подделок. Это обсуждается RhysC здесь .
ИМО, твой тест на создание должен:
У меня есть много модульных тестов, подобных вашему, главное отличие в том, что я использую метод глубокого сравнения для сравнения экземпляров объекта. Например, мои U-тесты выглядят так: