Вы не можете сделать это - по крайней мере, в истинном смысле TDD.
Использование стратегий DI / IoC, таких как Unity, означает, что ваши тесты зависят от внешнего компонента и не тестируются изолированно.
Затем тесты становятся интеграционными, а не модульными.
== Игнорируйте ответ ниже здесь ==
Полагаю, вы хотели знать, как сделать репозиторий тестируемым.
Введение интерфейса для него позволит вам смоделировать или заглушить его , что, в свою очередь, обеспечит возможность тестирования ваших объектов независимо от конкретной реализации Repository.
Я проиллюстрирую это, используя Rhino Mocks 3.5 для .NET 3.5 :
Давайте сделаем интерфейс из репозитория, назовем это IRepository
public interface IRepository
{
}
Теперь, поскольку вам нужно использовать IRepository для двух разных объектов, давайте просто воспользуемся обобщениями, чтобы вы могли создать свой репозиторий с помощью:
public interface IRepository<T>
конечно, это будет означать, что у вас будет какой-то метод поиска:
{
public IEnumerable<T> Find(Criteria criteria)
}
где ваш критерий является неким объектом, который позволяет вам задать, что искать, например, предложением where.
Теперь у вас есть объект:
public class SomeObject
{
IRepository<SomeObject> repository;
public SomeObject(){}
public IRepository<SomeObject> repository { get; set; }
IEnumerable<SomeObject> FindAll()
{
//let's assume new Criteria() will return all results
return respository.Find(new Criteria());
}
}
Вы хотите протестировать SomeObject
таким образом, чтобы FindAll () вернул ожидаемый набор результатов - вот где Mh Rhino Mocks может прийти:
[TestFixture]
public class SomeObjectTests
{
[Test]
public void TestSomeObjectFindAll()
{
IRepository<SomeObject> stubRepository = MockRepsitory.GenerateStub<IRepsitory<SomeObject>>();
stubRepository.Expect(r => r.Find(new Criteria())
.Return(new List<SomeObject>{
new SomeObject(),
new SomeObject(),
new SomeObject());
var testObject = new SomeObject { Repository = stubRepository };
IList<SomeObject> findAllResult = testObject.FindAll();
//returned list contains 3 elements, as expected above
Assert.AreEqual(3, findAllResult.Count)
}
}
Обратите внимание, что приведенный выше код не является оптимальной практикой TDD во всех отношениях, но это место для начала.
Ключевой концепцией здесь является введение интерфейсов для обеспечения слабой связи объектов , особенно когда объект имеет тенденцию выполнять такие вещи, как доступ к базам данных, файловым системам и т. Д.
Более подробный пример и лучшие примеры можно найти в статье Бена Холла о насмешках Rhino .