How to get build directory of a test project?

11,246

Solution 1

Use the DeploymentItemAttribute attribute. To quote MSDN:

This attribute identifies files and directories that contain files that are used by the deployed test to run. The test engine makes a copy of the deployment items and places them in test deployment directory based upon the OutputDirectory specified or the default directory.

For example:

[TestClass]
public class MyUnitTest
{
    [TestMethod()]
    [DeploymentItem("myfile.txt")]
    public void MyTestMethod()
    {          
        string file = "myfile.txt";           
        Assert.IsTrue(File.Exists(file), "deployment failed: " + file +
            " did not get deployed");
    }
}

Of course assuming you are using MSTest as your testing framework.

Solution 2

Try this:

string dir = Path.Combine(
    Path.GetDirectoryName(Assembly.GetExecutingAssembly().Location),
    "SupportFiles");

Don't use Directory.GetCurrentDirectory() because current directory could not be your exe dir and may change during program execution.

Solution 3

Switch to xUnit or NUnit.

Then both option 2., 3. and Environment.CurrentDirectory works as needed, returning the build-output-diretory. Remove "bin\Debug" or "bin\Release" and files can be left at 'Do not copy'.

Also see the GetFileFromMethod-method and usage in ElasticSearch for a nice way to have one file per test.

Solution 4

In case someone like me comes along, if you're using a .testsettings file and the DeploymentItem attribute on the class doesn't work even though you've set your files as Content and to Always Copy, it's because either you already have a Deployment section in your .testsettings file or you need to use DeploymentItem in the .testsettings file. Here's how ours looks now:

<Deployment>
    <DeploymentItem filename="Tests\Unit Tests\ConnectionStrings.config" />
    <DeploymentItem filename="Tests\Unit Tests\<project dir>\bin\Debug\TestFiles\" outputDirectory="TestFiles" />
</Deployment>

One does a file, the other does 13 files in a directory. Note the trailing slash for the directory's "filename"!

Solution and more info was found at:

MsTest DeploymentItem OutputDirectory in testsettings

Share:
11,246

Related videos on Youtube

Halfgaar
Author by

Halfgaar

Updated on September 15, 2022

Comments

  • Halfgaar
    Halfgaar over 1 year

    I have a test project in which I needs to load an XLSX file. For that, I added a file with copy-always so that it ends up in the build directory, but all of the following return a wrong path:

    1. System.Reflection.Assembly.GetAssembly(typeof(testclass)).Location;
    2. AppDomain.CurrentDomain.BaseDirectory
    3. Directory.GetCurrentDirectory();

    They all give me:

    "C:\\Users\\username\\Documents\\visual-studio-projecten\\projectname\\TestResults\\username_ICT003 2012-06-20 12_07_06\\Out"

    and I need

    "C:\\Users\\username\\Documents\\visual-studio-projecten\\projectname\\TestProject\\bin\\Debug\\SupportFiles\\"

    How do I accomplish that?

  • dtsg
    dtsg almost 12 years
    +1 for Don't use Directory.GetCurrentDirectory() because current directory could not be your exe dir and may change during program execution.