How to get Directory while running unit test

后端 未结 14 833
余生分开走
余生分开走 2021-02-02 05:07

Hi when running my unit test I\'m wanting to get the directory my project is running in to retrieve a file.

Say I have a Test project named MyProject. Test I run:

<
相关标签:
14条回答
  • 2021-02-02 05:19

    My approach relies on getting the location of the unit testing assembly and then traversing upwards. In the following snippet the variable folderProjectLevel will give you the path to the Unit test project.

    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 + "..\\..\\");
    
    0 讨论(0)
  • 2021-02-02 05:20

    use 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}源文件目录");
            }
        }
    
    
    0 讨论(0)
  • 2021-02-02 05:23

    I'm not sure if this helps, but this looks to be briefly touched on in the following question.

    Visual Studio Solution Path environment variable

    0 讨论(0)
  • 2021-02-02 05:24

    Usually you retrieve your solution directory (or project directory, depending on your solution structure) like this:

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

    This will give you the parent directory of the "TestResults" folder created by testing projects.

    0 讨论(0)
  • 2021-02-02 05:28
    Directory.GetParent(Directory.GetCurrentDirectory()).Parent.FullName;
    

    This will give you the directory you need....

    as

    AppDomain.CurrentDomain.SetupInformation.ApplicationBase 
    

    gives nothing but

    Directory.GetCurrentDirectory().
    

    Have alook at this link

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

    0 讨论(0)
  • 2021-02-02 05:37
    /// <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));
    }
    
    0 讨论(0)
提交回复
热议问题