program story

Visual Studio 2012 및 Entity Framework 5에서 단위 테스트를 위해 LocalDb를 설정하는 방법

inputbox 2020. 12. 2. 21:03
반응형

Visual Studio 2012 및 Entity Framework 5에서 단위 테스트를 위해 LocalDb를 설정하는 방법


Entity Framework 5를 사용하는 Visual Studio 2012 ASP.NET MVC 프로젝트가 있습니다.

데이터베이스에 의존하는 몇 가지 단위 테스트가 있습니다. 중앙 SQL Server 데이터베이스를 사용하도록 테스트 프로젝트에서 app.config 파일을 설정하면 제대로 작동합니다.

그러나 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'가 올바르지 않을 수 있습니다. 추가 오류를 진단 및 수정하고 작업을 다시 시도하십시오. CREATE DATABASE에 실패했습니다. 나열된 일부 파일 이름을 만들 수 없습니다. 관련 오류를 확인하십시오.

mdf 파일이 이미 존재하기를 원하는 것처럼 들리는데, 데이터베이스를 만들려고하기 때문에 이상하게 보입니다. mdf 파일을 수동으로 생성해도 오류 메시지는 변경되지 않습니다.


시험:

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

이것은 /bin/Debug/yourdbname.mdf에 Db 파일을 생성합니다.


다음을 사용합니다.

// 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


테스트 프로젝트의 경우 다음 사항에 유의하십시오.

AttachDBFilename = | DataDirectory |

즉, web / production / whatever 앱의 App_Data 폴더가 아니라 출력 / bin / debug 폴더에서 단위 테스트를 찾습니다.

두 가지 작업을 수행해야합니다. 1. 데이터베이스 파일을 App_Data 폴더에서 테스트 앱의 루트로 이동합니다. 2. 데이터베이스를 강조 표시하여 Visual Studio에서 속성 창을 가져옵니다. 프로젝트를 실행할 때 출력 폴더에 복사되도록 빌드 작업을 "콘텐츠"로 설정합니다.

짜잔.


이 코드를 사용하는 것이 좋습니다 ( Jupaol 의 답변에 따라 ).

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

일반적으로 이것은 TestResults\<test run>\Out\솔루션의 폴더 안에 데이터베이스를 만듭니다 .


문제에 대한 답을 찾는 동안 귀하의 질문을 찾았습니다. 별도의 프로젝트에서 nUnit과 함께 EntityFramework를 사용하여 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>

참고 URL : https://stackoverflow.com/questions/12244495/how-to-set-up-localdb-for-unit-tests-in-visual-studio-2012-and-entity-framework

반응형