57

我們使用實體框架5.如何設置的LocalDB單元測試在Visual Studio 2012和Entity Framework 5

有跡象表明,依賴於數據庫的一些單元測試一個Visual Studio 2012的ASP.NET MVC項目。在測試項目中設置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'可能不正確。診斷 並更正其他錯誤,然後重試該操作。 CREATE DATABASE失敗。列出的某些文件名不能被創建。檢查 相關錯誤。

聽起來好像它想要mdf文件已經存在,這似乎很奇怪,因爲它試圖創建數據庫。手動創建mdf文件不會更改錯誤消息。

+1

你可以檢查你有什麼樣的價值在單元測試時,你調用:'AppDomain.CurrentDomain.GetData(「DataDirectory」)'? –

+0

單元測試中'AppDomain.CurrentDomain.GetData(「DataDirectory」)'的值爲'null'。 –

+1

因此,要麼通過使用'SetData'將值設置爲某個路徑,要麼不要在連接字符串中使用'| DataDirectory |',因爲它是'null'。 –

回答

32

嘗試:

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

這將在/bin/Debug/yourdbname.mdf

創建數據庫文件
9

我會用:

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

+1

什麼類型是「context」和它從何而來? –

+3

添加一個像這樣的屬性給你的測試類,MSTest會爲你注入'public TestContext TestContext {get;組; }' – Jupaol

+0

你能解釋爲什麼在setup方法中這樣做比在我的'new Migrations.Configuration();'之前更好嗎? – bbodenmiller

3

請記住,對於測試公關oject:

 
AttachDBFilename=|DataDirectory| 

意味着它會看着你的輸出/斌/ debug文件夾中的一個單元測試在你的web /生產/任何應用反對App_Data文件夾。

您需要做兩件事 1.將數據庫文件移出您的App_Data文件夾到您的測試應用程序的根目錄。 2.突出顯示您的數據庫,以便在Visual Studio中獲得您的屬性窗口。將構建操作設置爲「內容」,以便在運行項目時將其複製到輸出文件夾。

Voila。

1

我建議使用此代碼(基於Jupaol答案):

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

通常這將解決方案的TestResults\<test run>\Out\文件夾內創建數據庫。

+0

嗨,使用VS 2013這個代碼工作時,我在「調試測試」模式下運行我的單元測試。但是當我運行「全部運行」測試時失敗。我怎樣才能讓它在「全部運行」模式下工作 – Martin

0

我在搜索問題的答案時發現了你的問題。 在一個單獨的項目中使用的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>

+0

這對於使用DataSource屬性的UnitTest有效? –

相關問題