2009-07-22 10 views
7

私のユニットテストプロジェクトでデータベースファイルを参照したいと思っています。これはASP.NET MVCアプリです。ユニットテストプロジェクトの接続文字列app_dataフォルダの参照データベース

注意:単体テストではデータベースにアクセスすべきではないことがわかっていますが、これは今すぐ通過する必要がある1つのテストでの迅速な修正です。

次のマイルストーンの後、私は、データベースへのアクセス方法をからかっされるなど

だからここに私に私のMVCアプリケーションのWeb構成で接続文字列とユニットテストap.configファイル

<add name="DBConnectionString" connectionString="Data Source=.\SQLEXPRESS;AttachDbFilename=|DataDirectory|\DB.MDF;Integrated Security=True;User Instance=True" 
    providerName="System.Data.SqlClient" /> 

です接続文字列が間違っている私には思える

Test method 
ED.Tests.Controllers.CandidateControllerTest.PersonalDetailsStepPostShouldRedisplayIfNoSurnameSupplied 
threw exception: System.Data.SqlClient.SqlException: 
An attempt to attach an auto-named database for file C:\Users\Desktop\ED\TestResults\LAPTOP-D 2009-07-22 18_16_20\Out\DB.MDF failed. 
A database with the same name exists, or specified file cannot be opened, or it is located on UNC share. 

が、私は適切にパスを設定するかどうかはわかりません:私は、私はエラーを取得するテストを実行します。 \ .. \ ..とディレクトリ名などを追加しようとしました。

+0

このMSTestはありますか? –

+0

これはVS2008に付属しているデフォルトですので、私はそう考えています。 – ddd

答えて

4

MSTestは、すべてのテスト実行時に全く異なるフォルダにユニットテストアセンブリを実行します。アイデアは、それぞれのランは、前後のランから完全に分離されたケースであるということです。実際には、アプリケーションの残りの部分と一緒にデータファイルをコピーするように指示するのは難しいことです。ソリューション(プロジェクトではなく)を右クリックし、追加を選択して新しいテスト実行構成を作成する必要があります。次に、テスト実行構成を編集し、テスト実行フォルダーにコピーするファイルを指定する必要があります。各テストの実行に使用されるフォルダを含むTestResultsというソリューションディレクトリの兄弟ディレクトリが必要です。

+0

他の出力フォルダに気づいた。 これは私の一日を寝たきりにしました;) – ddd

1

Craigのコメント:単体テスト実行のために余分なデータファイルを配置するのは苦痛ではありません。クラスまたはメソッドレベルでDeploymentItemAttribute(Microsoft.VisualStudio.TestTools.UnitTesting)を使用して、これらのテストを実行する前にコピーする必要があるファイルを指定できます。

+0

この方向へ私を指摘してくれてありがとう。実際には: [DeploymentItem( "connectionstrings.config")] –

2

あなたは、単にこのようlocaldb参照することができます。WebPortalDbは、データベース名です

<add name="DefaultConnection" 
connectionString="Server=(localdb)\v11.0;Database=WebPortalDb" providerName="System.Data.SqlClient"/> 

0

単体テストでデータベースに接続して、データベースをモックするのが最善の方法です。しかし、既存のMVCコードをリファクタリングしてデータベース依存関係をモックできるようにする必要があるかもしれませんし、コードがいくつかのテストでラップされるまで、決してリファクタリングするべきではありません。そのような状況では、はい、おそらくテストプロジェクトをデータベースに接続する必要があります。

私の場合、ASP.Net MVC 5を使用していました。これは単体テストプロジェクトのapp.configファイルにソリューションファイルを右クリックしてNuGetを管理するだけで必要なEntity Framework設定を追加できることを意味しました解決策を確認し、テストプロジェクトにEFを追加します。その後

MVCプロジェクトのメインWeb.configファイルから接続文字列を追加することはほぼは、私が言った、文字列の最後の部分を削除しなければならなかったマイナーな微調整して、働いていた私として

AttachDbFilename=|DataDirectory|<<MY_DATABASE_NAME_AND_ID>>.mdf 

をたとえば、データベースに接続する「ユニット」テストを作成するのは方法ではないため、これは一時的な手段に過ぎません。しかし、このコードでは、批判的な状態にするためにリファクタリングが必要であり、リファクタリングがすべてを壊していないことを証明するためのテストを数回行わなくても、

関連する問題