2009-03-26 2 views
2

я бег в эту ошибкуИспользование базы данных в блоке тесты

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 делая

AppDomain домен = AppDomain. CurrentDomain;

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

ответ

6

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

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

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

+0

Не могли бы вы рассказать о тех инструментах, которые могут это сделать? Мне хочется! –

+0

Rhino Mocks и Moq будут насмехаться над вами. Но насколько вы знакомы с интерфейсами? –