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 回答
11

除了@abhilash 的评论。

这适用于我的 EXE、DLL以及在调试或发布模式下从不同的 UnitTest 项目进行测试时:

var dirName = Path.GetDirectoryName(Assembly.GetExecutingAssembly().Location.Replace("bin\\Debug", string.Empty));
于 2018-05-07T02:51:59.477 回答
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 回答
4

对于 NUnit,这就是我所做的:

// Get the executing directory of the tests 
string dir = NUnit.Framework.TestContext.CurrentContext.TestDirectory;

// Infer the project directory from there...2 levels up (depending on project type - for asp.net omit the latter Parent for a single level up)
dir = System.IO.Directory.GetParent(dir).Parent.FullName;

如果需要,您可以从那里导航回其他目录(如果需要):

dir = Path.Combine(dir, "MySubDir");
于 2018-02-06T12:20:42.997 回答
2

我找到的最佳解决方案是将文件作为嵌入式资源放在测试项目中,并从我的单元测试中获取。有了这个解决方案,我不需要关心文件路径。

于 2013-07-10T13:29:06.830 回答
1

我不确定这是否有帮助,但这看起来会在以下问题中简要介绍。

Visual Studio 解决方案路径环境变量

于 2012-04-18T06:44:53.887 回答
1

通常,您可以使用它,无论是运行测试、控制台应用程序还是 Web 应用程序:

// returns the absolute path of assembly, file://C:/.../MyAssembly.dll
var codeBase = Assembly.GetExecutingAssembly().CodeBase;    
// returns the absolute path of assembly, i.e: C:\...\MyAssembly.dll
var location = Assembly.GetExecutingAssembly().Location;

如果您正在运行 NUnit,则:

// return the absolute path of directory, i.e. C:\...\
var testDirectory = TestContext.CurrentContext.TestDirectory;
于 2018-02-23T16:00:49.243 回答
1

我的方法依赖于获取单元测试程序集的位置,然后向上遍历。在以下代码段中,变量folderProjectLevel将为您提供单元测试项目的路径。

string pathAssembly = System.Reflection.Assembly.GetExecutingAssembly().Location;
string folderAssembly = System.IO.Path.GetDirectoryName(pathAssembly);
if (folderAssembly.EndsWith("\\") == false) {
    folderAssembly = folderAssembly + "\\";
}
string folderProjectLevel = System.IO.Path.GetFullPath(folderAssembly + "..\\..\\");
于 2018-10-23T12:25:50.200 回答
1

根据https://github.com/nunit/nunit/issues/742#issuecomment-121964506

对于 NUnit3 , System.Environment.CurrentDirector 永远不会改变,所以它应该是解决方案的路径。

例如:

string szProjectPath = System.Environment.CurrentDirectory + @"\where\your\project\is";

我更喜欢固定位置而不是 GetParent()。GetParent 的一个缺点是当构建从 AnyCPU 更改为 x86 时,默认路径将从 bin\Debug 更改为 bin\x86\Debug。需要另一个父母,这是脖子上的痛苦。

此外,您仍然可以访问您的测试程序集TestContext.CurrentContext.TestDirectory并从中获取输出TestContext.CurrentContext.WorkDirectory

编辑:注意:NUnit3 有很多变化。我建议阅读有关“重大更改”的文档

于 2019-12-13T07:43:27.277 回答
0

你可以这样做:

using System.IO;

Path.GetFullPath(Path.Combine(AppDomain.CurrentDomain.SetupInformation.ApplicationBase, @"..\..\"));
于 2018-04-11T11:31:41.573 回答
0

使用 StackTrace

    internal static class Extensions
    {
        public static string GetSourceDirectoryName(this Type type)
        {
            StackTrace stackTrace = new StackTrace(true);

            foreach (var frame in stackTrace.GetFrames())
            {
                if (frame.GetMethod() is { } method && method.DeclaringType == type)
                {
                    return Path.GetDirectoryName(frame.GetFileName());
                }
            }

            throw new Exception($"未找到{type.Name}源文件目录&quot;);
        }
    }

于 2021-01-31T14:26:00.793 回答