Подтвердить что ты не робот

Как настроить LocalDb для модульных тестов в Visual Studio 2012 и Entity Framework 5

У нас есть проект ASP.NET MVC Visual Studio 2012 с использованием Entity Framework 5.

Есть несколько модульных тестов, которые зависят от базы данных. Настройка файла app.config в тестовом проекте на использование центральной базы данных SQL Server прекрасна.

Однако было бы гораздо лучше использовать LocalDb, чтобы каждый разработчик имел свою собственную базу данных при запуске тестов. Тем более, что мы хотели бы, чтобы тесты выполнялись при DropCreateDatabaseAlways при запуске.

Однако я не могу заставить эту установку работать. Если я попробую это в app.config:

<add name="TestDb" 
   connectionString="Data Source=(LocalDb)\v11.0;Initial Catalog=unittestdb;
     Integrated Security=SSPI;AttachDBFilename=|DataDirectory|\unittestdb.mdf"
   providerName="System.Data.SqlClient" />

Я получаю:

System.Data.SqlClient.SqlException: произошла ошибка активации файла. Физическое имя файла '\ unittestdb.mdf' может быть неправильным. диагностики и исправить дополнительные ошибки, и повторить операцию. СОЗДАЙТЕ Сбой базы данных. Некоторые имена файлов не могут быть созданы. Проверьте связанных с ошибками.

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

4b9b3361

Ответ 1

Try:

AppDomain.CurrentDomain.SetData(
  "DataDirectory", Path.Combine(AppDomain.CurrentDomain.BaseDirectory, ""));

Это создаст файл Db на/bin/Debug/yourdbname.mdf

Ответ 2

Я бы использовал:

// Declare this property - this is set by MSTest
public TestContext TestContext { get; set; }

// In test initialization - note the signature should be exactly this
// A static void method with one argument of type TestContext 
[ClassInitialize]
public static void SetUp(TestContext context)
{
   AppDomain.CurrentDomain.SetData("DataDirectory", Path.Combine(context.TestDeploymentDir, string.Empty));
}

У вас могут возникнуть проблемы с использованием AppDomain.CurrentDomain.BaseDirectory, вместо этого используйте: context.TestDeploymentDir

Ответ 3

Имейте в виду, что для тестового проекта:

AttachDBFilename=|DataDirectory|

означает, что он будет выглядеть в вашей папке вывода /bin/debug для unit test, а не в папке App_Data в вашем приложении web/production/whatever.

Вам нужно сделать две вещи 1. Переместите файл базы данных OUT вашей папки App_Data в корень вашего тестового приложения. 2. Выделите свою базу данных, чтобы получить окно свойств в Visual Studio. Установите действие сборки в "Содержимое", чтобы оно было скопировано в вашу выходную папку при запуске проекта.

Voila.

Ответ 4

Я предлагаю использовать этот код (на основе ответа Jupaol):

[ClassInitialize]
public static void SetUp(TestContext context)
{
    AppDomain.CurrentDomain.SetData(
        "DataDirectory", 
        context.TestDeploymentDir);
}

Обычно это создаст вашу базу данных внутри папки TestResults\<test run>\Out\ вашего решения.

Ответ 5

Я нашел ваш вопрос во время поиска ответа на проблему. Используя EntityFramework с nUnit в отдельном проекте, мне пришлось изменить App.config

выглядел следующим образом:

<?xml version="1.0" encoding="utf-8"?>
<configuration>
  <configSections>
    <!-- For more information on Entity Framework configuration, visit http://go.microsoft.com/fwlink/?LinkID=237468 -->
    <section name="entityFramework" type="System.Data.Entity.Internal.ConfigFile.EntityFrameworkSection, EntityFramework, Version=6.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" requirePermission="false" />
  </configSections>
  <entityFramework>
    <defaultConnectionFactory type="System.Data.Entity.Infrastructure.LocalDbConnectionFactory, EntityFramework">
      <parameters>
        <parameter value="v11.0" />
      </parameters>
    </defaultConnectionFactory>
    <providers>
      <provider invariantName="System.Data.SqlClient" type="System.Data.Entity.SqlServer.SqlProviderServices, EntityFramework.SqlServer" />
    </providers>
  </entityFramework>
</configuration>