如何在运行单元测试时获取目录

Ano*_*use 68 c# directory unit-testing

嗨,当我运行我的单元测试时,我想要获取我的项目正在运行的目录来检索文件.

假设我有一个名为MyProject的测试项目.测试我运行:

AppDomain.CurrentDomain.SetupInformation.ApplicationBase
Run Code Online (Sandbox Code Playgroud)

我接受"C:\\Source\\MyProject.Test\\bin\\Debug".

这接近我所追求的.我不想要这个bin\\Debug部分.

任何人都知道我怎么能得到"C:\\Source\\MyProject.Test\\"

Ili*_*ian 65

我会做的不同.

我建议将该文件作为解决方案/项目的一部分.然后右键单击 - >属性 - >复制到输出=始终复制.

然后该文件将被复制到您的输出目录(例如C:\ Source\MyProject.Test\bin\Debug).

  • @ RickO'Shea最初的问题是[XY问题](http://meta.stackexchange.com/q/66377).提问者在他的评论中澄清了他想做什么 - "是的我想在运行单元测试时检索文件".我只是解决了他的实际问题(而不是他试图解决的问题). (8认同)
  • 我还使用了"Copy To Output"技术,它在单独运行单元测试时也能正常工作.但是,从有序测试的上下文中运行它时,它不起作用.我得到一个错误:`System.IO.FileNotFoundException:找不到文件'C:\ SVN\MyProject\TestResults\myName_MACHINE 2017-04-26 12_44_09\Out\MySpreadsheet.xlsx`显然有一个不同的子目录创建用于保存测试结果和IDK为什么我的执行代码会在那里看... (6认同)
  • 并且不要忘记,您还需要将"构建操作"设置为NONE. (3认同)
  • 在构建时如何将文件复制到输出文件夹的问题与所问的问题不同。 (2认同)
  • @IlianPinzon 您不能调用任何您不同意 XY 问题的解决方案。;) 这是一个有效的问题,值得直接回答。 (2认同)

Dar*_*nas 36

通常,您检索解决方案目录(或项目目录,具体取决于您的解决方案结构),如下所示:

string solution_dir = Path.GetDirectoryName( Path.GetDirectoryName(
    TestContext.CurrentContext.TestDirectory ) );
Run Code Online (Sandbox Code Playgroud)

这将为您提供测试项目创建的"TestResults"文件夹的父目录.

  • 2016回答:Path.GetDirectoryName(Path.GetDirectoryName(TestContext.CurrentContext.TestDirectory)) (9认同)
  • TestDir被标记为已弃用(2016),请考虑使用TestContext.TestRunDirectory. (6认同)
  • 这不适用于xUnit。使用Path.GetDirectoryName(Assembly.GetExecutingAssembly()。Location) (3认同)
  • 什么是`TestContext.TestDir`? (2认同)

man*_*hah 25

Directory.GetParent(Directory.GetCurrentDirectory()).Parent.FullName;
Run Code Online (Sandbox Code Playgroud)

这将为您提供所需的目录....

AppDomain.CurrentDomain.SetupInformation.ApplicationBase 
Run Code Online (Sandbox Code Playgroud)

什么都没有

Directory.GetCurrentDirectory().
Run Code Online (Sandbox Code Playgroud)

已经在这个链接上了

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

  • `Directory.GetCurrentDirectory()` 不适用于(单元)测试,因为它将返回单元测试框架创建的一些临时目录。所以这不是真的。 (2认同)

Jer*_*son 7

继续@ abhilash的评论.

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

var dirName = Path.GetDirectoryName(Assembly.GetExecutingAssembly().Location.Replace("bin\\Debug", string.Empty));
Run Code Online (Sandbox Code Playgroud)

  • 这是正确的,但简单的答案是:Path.GetDirectoryName(Assembly.GetExecutingAssembly().Location) (3认同)
  • 调试和发布模式...您的代码违背了我的回答的目的。 (2认同)

use*_*577 6

/// <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));
}
Run Code Online (Sandbox Code Playgroud)


AHM*_*AHM 5

我通常这样做,然后我只是添加"..\..\"到路径,以达到我想要的目录.

所以你能做的就是:

var path = AppDomain.CurrentDomain.SetupInformation.ApplicationBase + @"..\..\";
Run Code Online (Sandbox Code Playgroud)