Использование базы данных в модульных тестах - PullRequest
2 голосов
/ 26 марта 2009

Я столкнулся с этой ошибкой

An attempt to attach an auto-named database for file C:\<...>\Out\MessagesDB.mdf failed. A database with the same name exists, or specified file cannot be opened, or it is located on UNC share..  

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

В App.config для тестового проекта я использую

<connectionStrings>
    <add name="MessagesDBConnectionString" connectionString="Data Source=.\SQLEXPRESS;AttachDbFilename=|DataDirectory|\MessagesDB.mdf;Integrated Security=True;User Instance=True"
      providerName="System.Data.SqlClient" />
</connectionStrings>

и затем переопределите DataDirectory, выполнив

домен домена приложения = домен домена приложения. Домен;

        String currentDirectory = System.Environment.CurrentDirectory;
        String DataDirectory = currentDirectory.Substring(0, currentDirectory.IndexOf("TestResults")) + "Server\\App_Data";
        domain.SetData("DataDirectory", DataDirectory);
        db = new Server.Models.MessagesDBDataContext();

Который прекрасно работает, но выглядит как хак. Как я должен был это сделать?

Edit:

Я еще раз взглянул на этот ужасный беспорядок сегодня и на основе примера Nerd Dinner я удалил все прямые вызовы базы данных из контроллеров в моем проекте и переместил их в объект репозитория, который реализует интерфейс (IRepository). Затем я создал поддельный объект репозитория, который также реализовал IRepository. Я добавил конструктор к каждому контроллеру, который позволял использовать IRepository. Конструктор контроллера по умолчанию был изменен для инициализации хранилища. Тесты больше не общаются с базой данных, поэтому они быстрее и гораздо менее разрушительны.

1 Ответ

6 голосов
/ 26 марта 2009

Стандартный подход заключается в макете базы данных. Это означает, что класс, который вы тестируете, принимает параметр, который предоставляет данные, и выглядит как соединение с базой данных.

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

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

...