94

こんにちは、単体テストを実行するときに、プロジェクトが実行されているディレクトリを取得してファイルを取得したいと考えています。

MyProject という名前のテスト プロジェクトがあるとします。私が実行するテスト:

AppDomain.CurrentDomain.SetupInformation.ApplicationBase

と受け取り"C:\\Source\\MyProject.Test\\bin\\Debug"ます。

これは私が求めているものに近いです。私はその部分が欲しくないbin\\Debug

代わりに私が得る方法を知っている人はいます"C:\\Source\\MyProject.Test\\"か?

4

14 に答える 14

80

私はそれを別の方法で行います。

そのファイルをソリューション/プロジェクトの一部にすることをお勧めします。次に、右クリック->[プロパティ]->[出力にコピー]=[常にコピー]を選択します。

そのファイルは、出力ディレクトリ(C:\ Source \ MyProject.Test \ bin \ Debugなど)にコピーされます。

編集:出力にコピー=新しい方が適切な場合はコピー

于 2012-04-18T06:51:30.340 に答える
48

通常、次のようにソリューション ディレクトリ (またはソリューションの構造に応じてプロジェクト ディレクトリ) を取得します。

string solution_dir = Path.GetDirectoryName( Path.GetDirectoryName(
    TestContext.CurrentContext.TestDirectory ) );

これにより、テスト プロジェクトによって作成された "TestResults" フォルダーの親ディレクトリが得られます。

于 2013-10-15T04:20:51.027 に答える
33
Directory.GetParent(Directory.GetCurrentDirectory()).Parent.FullName;

これにより、必要なディレクトリが得られます....

なので

AppDomain.CurrentDomain.SetupInformation.ApplicationBase 

何も与えない

Directory.GetCurrentDirectory().

このリンクを見てください

http://msdn.microsoft.com/en-us/library/system.appdomain.currentdomain.aspx

于 2012-04-18T06:54:50.383 に答える
8
/// <summary>
/// Testing various directory sources in a Unit Test project
/// </summary>
/// <remarks>
/// I want to mimic the web app's App_Data folder in a Unit Test project:
/// A) Using Copy to Output Directory on each data file
/// D) Without having to set Copy to Output Directory on each data file
/// </remarks>
[TestMethod]
public void UT_PathsExist()
{
    // Gets bin\Release or bin\Debug depending on mode
    string baseA = AppDomain.CurrentDomain.SetupInformation.ApplicationBase;
    Console.WriteLine(string.Format("Dir A:{0}", baseA));
    Assert.IsTrue(System.IO.Directory.Exists(baseA));

    // Gets bin\Release or bin\Debug depending on mode
    string baseB = AppDomain.CurrentDomain.BaseDirectory;
    Console.WriteLine(string.Format("Dir B:{0}", baseB));
    Assert.IsTrue(System.IO.Directory.Exists(baseB));

    // Returns empty string (or exception if you use .ToString()
    string baseC = (string)AppDomain.CurrentDomain.GetData("DataDirectory");
    Console.WriteLine(string.Format("Dir C:{0}", baseC));
    Assert.IsFalse(System.IO.Directory.Exists(baseC));


    // Move up two levels
    string baseD = System.IO.Directory.GetParent(baseA).Parent.FullName;
    Console.WriteLine(string.Format("Dir D:{0}", baseD));
    Assert.IsTrue(System.IO.Directory.Exists(baseD));


    // You need to set the Copy to Output Directory on each data file
    var appPathA = System.IO.Path.Combine(baseA, "App_Data");
    Console.WriteLine(string.Format("Dir A/App_Data:{0}", appPathA));
    // C:/solution/UnitTestProject/bin/Debug/App_Data
    Assert.IsTrue(System.IO.Directory.Exists(appPathA));

    // You can work with data files in the project directory's App_Data folder (or any other test data folder) 
    var appPathD = System.IO.Path.Combine(baseD, "App_Data");
    Console.WriteLine(string.Format("Dir D/App_Data:{0}", appPathD));
    // C:/solution/UnitTestProject/App_Data
    Assert.IsTrue(System.IO.Directory.Exists(appPathD));
}
于 2016-01-08T11:49:27.090 に答える
6

私は通常、そのようにし"..\..\"て、パスに追加して、必要なディレクトリに到達します。

だからあなたができることはこれです:

var path = AppDomain.CurrentDomain.SetupInformation.ApplicationBase + @"..\..\";
于 2012-04-18T06:45:34.773 に答える
1

これが役立つかどうかはわかりませんが、次の質問で簡単に触れているようです。

Visual Studio ソリューション パス環境変数

于 2012-04-18T06:44:53.887 に答える