57

Chúng tôi có một Visual Studio 2012 dự án ASP.NET MVC sử dụng Entity Framework 5.Làm thế nào để thiết lập LocalDb cho unit tests trong Visual Studio 2012 và Entity Framework 5

Có một số xét nghiệm đơn vị đó phụ thuộc vào một cơ sở dữ liệu. Thiết lập tệp app.config trong dự án thử nghiệm để sử dụng cơ sở dữ liệu SQL Server trung tâm hoạt động tốt.

Tuy nhiên, sẽ tốt hơn nếu sử dụng LocalDb, để mỗi nhà phát triển có cơ sở dữ liệu riêng của mình khi chạy thử nghiệm. Đặc biệt là kể từ khi chúng tôi muốn có các bài kiểm tra thiết lập để DropCreateDatabaseAlways khi chạy.

Tuy nhiên, tôi không thể thiết lập để hoạt động. Nếu tôi cố gắng này trong 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" /> 

tôi nhận được:

System.Data.SqlClient.SqlException: Một lỗi kích hoạt tập tin xảy ra. Tên tệp vật lý '\ unittestdb.mdf' có thể không chính xác. Chẩn đoán và sửa các lỗi bổ sung và thử lại thao tác. CREATE DATABASE không thành công. Một số tên tập tin liệt kê không thể được tạo ra. Kiểm tra lỗi liên quan.

Có vẻ như nó muốn tệp mdf tồn tại, điều này có vẻ lạ vì nó đang cố tạo cơ sở dữ liệu. Tạo tệp mdf theo cách thủ công sẽ không thay đổi thông báo lỗi.

+1

Bạn có thể kiểm tra những giá trị nào bạn có trong đơn vị thử nghiệm khi bạn gọi: 'AppDomain.CurrentDomain.GetData (" DataDirectory ")'? –

+0

Giá trị của 'AppDomain.CurrentDomain.GetData (" DataDirectory ")' trong thử nghiệm đơn vị là 'null'. –

+1

Vì vậy, hoặc đặt giá trị cho một số đường dẫn bằng cách sử dụng 'SetData' hoặc không sử dụng' | DataDirectory | 'trong chuỗi kết nối vì nó là' null'. –

Trả lời

32

Hãy thử:

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

này sẽ Tạo Db File trên /bin/Debug/yourdbname.mdf

9

Tôi sẽ sử dụng:

// 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)); 
} 

Bạn có thể nhận các vấn đề sử dụng AppDomain.CurrentDomain.BaseDirectory, thay vì sử dụng: context.TestDeploymentDir

+1

Loại 'context' là gì và nó đến từ đâu? –

+3

Thêm một thuộc tính như thế này vào lớp thử nghiệm của bạn và MSTest sẽ tiêm cho bạn 'public TestContext TestContext {get; bộ; } ' – Jupaol

+0

Bạn có thể giải thích tại sao thực hiện điều này trong một phương thức thiết lập tốt hơn so với trước' new Migrations.Configuration(); '? – bbodenmiller

3

Hãy nhớ rằng đối với thử nghiệm pr oject:

 
AttachDBFilename=|DataDirectory| 

có nghĩa là nó sẽ tìm trong đầu ra/bin/thư mục debug của bạn cho một bài kiểm tra đơn vị như trái ngược với thư mục App_Data trong web/sản xuất/bất cứ ứng dụng của bạn.

Bạn cần thực hiện hai điều 1. Di chuyển tệp cơ sở dữ liệu OUT OF thư mục App_Data vào thư mục gốc của ứng dụng thử nghiệm của bạn. 2. Đánh dấu cơ sở dữ liệu của bạn để bạn có được cửa sổ thuộc tính của bạn trong Visual Studio. Đặt hành động xây dựng thành "Nội dung" để nó sẽ được sao chép vào thư mục đầu ra của bạn khi bạn chạy dự án.

Thì đấy.

1

Tôi đề nghị để sử dụng mã này (dựa trên câu trả lời của Jupaol):

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

thường, điều này sẽ tạo ra cơ sở dữ liệu của bạn bên trong TestResults\<test run>\Out\ thư mục của giải pháp của bạn.

+0

Xin chào, Sử dụng VS 2013 mã này hoạt động khi tôi chạy thử nghiệm đơn vị của mình trong chế độ "Thử nghiệm gỡ lỗi". Nhưng nó không thành công khi tôi chạy thử nghiệm "Chạy tất cả". Làm thế nào tôi có thể làm cho nó hoạt động trong chế độ "Chạy tất cả" – Martin

0

Tôi đã tìm thấy câu hỏi của bạn trong khi tìm kiếm câu trả lời cho sự cố. Sử dụng EntityFramework với nUnit trong một dự án riêng biệt, tôi đã phải thay đổi App.config

trông như thế này:

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

Và điều đó đã làm việc cho UnitTest bằng cách sử dụng thuộc tính DataSource? –

Các vấn đề liên quan