MSTest [DeploymentItem] and Environment Variables

Today I’ve been fixing up the build system for Microsoft.Activities and Microsoft.Activities.UnitTesting.  Over time I’ve been using a combination of strange tools and batch files to build things but it became such a mess I decided to take the time to finally build a good project file that I can use MSBuild on that will do everything

  • Build sources
  • Build Help files
  • Build NuGet Packages

The first problem I ran into was that my unit tests use the [DeploymentItem] attribute to deploy files when testing with MSTest.  The problem is that the test considers the $(SolutionDir) the root folder for the test.  Previously I had just the Solutions for Microsoft.Activities and Microsoft.Activities.UnitTesting but now I made a single solution file in a different location with everything.  This cause my tests to be broken because the deployment paths were wrong.

After much searching I finally decided the best thing to do was to use an environment variable.  Since I call these projects “Labs" projects (for historical reasons) I decided to use a variable called “LABDIR”.

    1: [TestMethod]
    2: [DeploymentItem(@"%LABDIR%\Microsoft.Activities\Microsoft.Activities.Tests\AddToNumOrThrow.xaml")]
    3: public void LoadAndInvokeShouldRun()

Now I can get my items deployed successfully regardless of where the solution file is opened.

But then, what if I try to build on another machine where LABDIR is not set?  I decided to modify the Test Project so that it will fail the build if the variable is not set.  Ok – search engines take note of the following question so that the next guy searching for this can find it.

How do I cause a build failure if an environment variable is not set?

Just add this to the end of your Test project .csproj file

    1: <Import Project="$(MSBuildBinPath)\Microsoft.CSharp.targets" />
    2: <!--To modify your build process, add your task inside one of the targets below and uncomment it. 
    3:      Other similar extension points exist, see Microsoft.Common.targets.-->
    4: <Target Name="BeforeBuild">
    5:   <Error Text="The LABDIR property must be set on the command line or environment variable must be supplied."
    6:             Condition="'$(LABDIR)' == ''" />
    7: </Target>
    8: <Target Name="AfterBuild">
    9: </Target>
   10: </Project>

Now if I try to build the test project without LABDIR set, I get this.

 Error  The LABDIR property must be set on the command line or environment variable must be supplied.

Happy Coding

Ron Jacobs

https://www.ronjacobs.com

Twitter: @ronljacobs