2016-09-12 2 views
0

Проект тестирования модулей (NUnit) создан для тестирования Business Logic. Подавляющее большинство этой логики находится в моем проекте Business Logic. У меня есть отдельная DLL со всем этим. Мое приложение является многоуровневым и имеет проект для интерфейса пользователя, уровня обслуживания, бизнес-логики и доступа к данным.Ссылки на проекты проекта Unit Test

В настоящее время UI ссылки Service.Service ссылаются на BL, BL ссылки DA. По всем проектам.

У меня есть общий проект, на который ссылаются все проекты. Он содержит объекты DTO и некоторые общие ENUMS и некоторые биты кода.

В моем аксессуаре данных у меня есть класс «База данных» (например). У него много методов манипулирования данными ... get Person, update person и т. Д. У меня также есть база данных интерфейса в том же проекте.

В моем тестовом проекте я хочу высмеять вызовы базы данных. Но мой конструктор в моем BL, имеет ссылку на базу данных, поэтому я могу использовать IoC. Чтобы иметь возможность высмеивать это из моих модульных тестов, мне нужно иметь ссылку на проект на уровень базы данных. Это нормально? Это из-за IoC и метода вызова, который должен предоставить конструктору конкретный класс.

ответ

0

Вы можете решить эту проблему, извлекая интерфейсы, связанные с БД, из уровня базы данных в BL и вставляйте их в конструкторы вместо фактических реализаций. Это на самом деле рекомендуется, например, если вы хотите иметь возможность подключать другой уровень вместо DB (другой DB, файл/внешняя служба и т. Д.) - для этого потребуется другой набор реализаций для этих интерфейсов (скажем, IUserQuerier -> DbUserQuerier, FileUserQuerier и т. Д.)

+0

Спасибо. Итак, интерфейсы должны действительно быть в вызове позже? Это кажется странным, потому что дальше, если у вас есть пользовательский интерфейс, позже вызывающий службу позже, похоже, что интерфейсы будут в пользовательском интерфейсе позже для служб? – Craig

+0

Нет, это не так масштабируется, а скорее: если вы думаете с точки зрения DDD (Domain Driven Design), я бы попытался сохранить большую часть своих _interfaces_ в ** Domain **, что в обратитесь к большинству других частей приложения (включая слой пользовательского интерфейса); однако он был бы в значительной степени единственным, в то время как другие слои (например, DB) могли бы получить ссылку только на загрузку IoC (например, корневой каталог) –