現在、VS 2008で標準のMicrosoft単体テストスイートを使用しています。ReSharper4.5もインストールされています。私の単体テストは、データファイルをプリロードするTestInitializeメソッドに依存しています。このテストデータファイルへのパスは、標準のCtrl-R + Ctrl-TコマンドとResharperユニットテスト実行コマンドを使用してVS 2008内からユニットテストを実行するかどうかによって異なります。
TestInitializeメソッドは、単体テストデータファイルへの正しいパスをどのように知ることができますか?
更新:
テストデータは十分に大きいため、文字列にプッシュしたくないので、外部ファイルとして保持することをお勧めします。私のテストプロジェクトのファイル構造は、MVCアプリケーションで作成された標準の単体テストプロジェクトのファイル構造です。テストプロジェクトのルートの下に、「Test Data」という名前の新しいフォルダーが作成されました。テストランナーに関係なくアクセスしたいのはこのフォルダーです。
テストファイルの場所はテストランナーによって異なると言っているので、プロジェクトに含まれており、dllと共にコピーされていると仮定します。
string path = AppDomain.CurrentDomain.BaseDirectory;
これにより、テストを実行しているフォルダーが取得されます。
[編集]
Visual Studioで。
Resharper->オプション->ツール->単体テスト->実行結果:指定されたフォルダー(またはテストプロジェクトのプロジェクト出力フォルダーを変更)
テストデータのフォルダーを指定できる場所、または指定したフォルダーに関連する場所。
(.netコアマルチターゲットプロジェクトの出力パスも受け入れるように更新された元の回答)
テストデータファイルは、ルート「Test_Data」フォルダー内のパラメーター「testDataFolder」として渡すフォルダーにあることを前提としています。
public static string GetTestDataFolder(string testDataFolder)
{
string startupPath = ApplicationEnvironment.ApplicationBasePath;
var pathItems = startupPath.Split(Path.DirectorySeparatorChar);
var pos = pathItems.Reverse().ToList().FindIndex(x => string.Equals("bin", x));
string projectPath = String.Join(Path.DirectorySeparatorChar.ToString(), pathItems.Take(pathItems.Length - pos - 1));
return Path.Combine(projectPath, "Test_Data", testDataFolder);
}
テストスイートの初期化ルーチンでテストデータを最初から作成します。
これは、特定の場所にあることに依存せず、不注意による改ざんから安全であることを意味します。