TDD с веб-конфигурацией - PullRequest
2 голосов
/ 18 июня 2010

Все великие истории, которые они всегда начинают с этих 4 волшебных слов ... Я унаследовал систему ... нет, подождите!это не правильно!

В любом случае, с моей попыткой юмора теперь прошло, мне не так много дали, мне нужно больше поддерживать существующий сервис.

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

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

Мой вопрос начинается здесь, если кто-то хочет избежать вышеуказанногоwaffle

Поэтому я хочу использовать TDD в работе, которую я выполняю, но служба, которую я унаследовала (которая станет нашим уровнем данных), тесно связана со строкой подключения к базе данных, расположенной в определенном месте.узел подключения в Web.Config.

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

Поэтому мне пришлось добавить и файл App.Config с ожидаемым узлом в мой тестовый проект.

Это нормально, или я должен начать инвестироватькогда-нибудь отделить конфигурацию базы данных от слоя данных?

Ответы [ 4 ]

1 голос
/ 28 июня 2010

Как вы упоминали, инъекция зависимостей - это путь. Вы также хотите убедиться, что ваши потребители вашего объекта конфигурации не зависят от вашей конкретной реализации конфигурации, такой как ConfigurationManager, ConfigurationSections и т. Д. Чтобы увидеть полный пример использования пользовательской конфигурации, вы можете взглянуть на мое сообщение в блоге на Невежество конфигурации , но в основном оно состоит из.

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

public BasicConfigurationSection : ConfigurationSection, IBasicConfiguration
{
    ...
}

Чтобы решить, как повторяется конфигурация, мы используем поставщика конфигурации, поставщик конфигурации для конкретной конфигурации знает, как получить ее конфигурацию

public interface IConfigurationProvider<TConfiguration>
{
    TConfiguration GetConfiguration();
}

public class BasicConfigurationProvider : IConfigurationProvider<IBasicConfiguration>
{
    public IBasicConfiguration GetConfiguration()
    {
        return (BasicConfigurationSection)ConfigurationManager.GetSection("Our/Xml/Structure/BasicConfiguration");
    }
}

Если вы используете Виндзор, вы можете подключить его к заводу Виндзора.

Надеюсь, это поможет.

1 голос
/ 18 июня 2010

Вы можете использовать Dependency Injection, чтобы "отвязать" ваш код от web.config (или app.config в этом отношении):

http://weblogs.asp.net/psteele/archive/2009/11/23/use-dependency-injection-to-simplify-application-settings.aspx

1 голос
/ 19 июня 2010

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

Так что, чтобы ответить на ваш вопрос напрямую, нет ничего плохого в добавлении файла конфигурации для поддержки ваших тестов.На самом деле это довольно распространено для модульного тестирования унаследованных систем (устаревшая система не тестировалась).Кроме того, когда у меня не осталось других вариантов, я прибегал к использованию отражения, чтобы «вставить» поддельные значения конфигурации в ConfigurationManager, чтобы протестировать код, который считывает значения конфигурации, но это, вероятно, последнее средство.

1 голос
/ 18 июня 2010

Попробуйте использовать Dependancy Injection для макета вашего DataLayer.

В TDD вы (не обязательно) тестируете свой слой данных и базу данных, но BusinessLogic.

Некоторые ссылки:

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