2

私はこのエラーに遭遇していました

An attempt to attach an auto-named database for file C:\<...>\Out\MessagesDB.mdf failed. A database with the same name exists, or specified file cannot be opened, or it is located on UNC share..  

コントローラーをテストするための単体テストを作成しようとしています。問題は、メイン プロジェクトで定義したデータベースをテストが使用しないようにしようとしていたことだと思いました。そこで、テストの接続文字列を次のように変更しました

私が使用しているテスト プロジェクトの App.config で

<connectionStrings>
    <add name="MessagesDBConnectionString" connectionString="Data Source=.\SQLEXPRESS;AttachDbFilename=|DataDirectory|\MessagesDB.mdf;Integrated Security=True;User Instance=True"
      providerName="System.Data.SqlClient" />
</connectionStrings>

そして、次のようにして DataDirectory を上書きしました

AppDomain ドメイン = AppDomain.CurrentDomain;

        String currentDirectory = System.Environment.CurrentDirectory;
        String DataDirectory = currentDirectory.Substring(0, currentDirectory.IndexOf("TestResults")) + "Server\\App_Data";
        domain.SetData("DataDirectory", DataDirectory);
        db = new Server.Models.MessagesDBDataContext();

これはうまく機能しますが、ハックのように見えます。これをどのように行うべきでしたか?

編集:

今日、このひどい混乱をもう一度見て、Nerd Dinner の例に基づいて、プロジェクトのコントローラーからデータベースへのすべての直接呼び出しを削除し、それらをインターフェイス (IRepository) を実装するリポジトリ オブジェクトに移動しました。次に、IRepository も実装した偽のリポジトリ オブジェクトを作成しました。IRepository を使用できるようにするコンストラクターを各コントローラーに追加しました。その後、デフォルトのコントローラ コンストラクタが変更され、リポジトリが初期化されました。テストはデータベースと対話しなくなったため、より高速で破壊的ではなくなりました。

4

1 に答える 1

6

標準的なアプローチは、データベースをモックアウトすることです。つまり、テストしているクラスは、データを提供するパラメーターを受け取り、データベース接続のように見えます。

単体テストでは、ハードコードされたデータを提供する実装を実際に渡します。

たとえば、データベースクエリの結果を構成ファイルに保存して、実際のデータでテストをセットアップできるようにするなど、これを支援するツールがありますが、保存されているため、すばやくロードされ、変更されることはありません。データベースとは別のファイルに。SnapDALは、これに使用できるツールの 1 つです。

于 2009-03-26T03:16:33.043 に答える