Search code examples
c#visual-studiomsbuildwebdeployslowcheetah

App.config replacements for unit tests


my continuous integration server (TeamCity) is configured to run all the unit tests in our app on build. Prior to running those tests, i need to change some of the appSettings to make them valid for our CI server. I'm achieving something similar for my web project by using the deployment project provided with Visual Studio. Can i do the same for a Test project?

Thanks, Gonzalo


Solution

  • It's possible to use Web.config Transformations for App.config files through a workaround.

    You simply have to invoke the appropriate MSBuild tasks at the right stage in your build process.
    Add this code snippet to your project file:

    <UsingTask
        TaskName="TransformXml"
        AssemblyFile="$(MSBuildExtensionsPath32)\Microsoft\VisualStudio\v10.0\Web\Microsoft.Web.Publishing.Tasks.dll" />
    
    <Target Name="AfterCompile" Condition="exists('App.$(Configuration).config')">
        <!-- Generates the transformed App.config in the intermediate directory -->
        <TransformXml
            Source="App.config"
            Destination="$(IntermediateOutputPath)$(TargetFileName).config"
            Transform="App.$(Configuration).config" />
        <!-- Forces the build process to use the transformed configuration file -->
        <ItemGroup>
            <AppConfigWithTargetPath Remove="App.config"/>
            <AppConfigWithTargetPath
                Include="$(IntermediateOutputPath)$(TargetFileName).config">
                <TargetPath>$(TargetFileName).config</TargetPath>
            </AppConfigWithTargetPath>
        </ItemGroup>
    </Target>
    

    Then add additional App.config files to your project for each build configuration where you wish to apply a transformation. For example:

    <ItemGroup>
        <None Include="App.config" />
        <None Include="App.Release.config">
            <DependentUpon>App.config</DependentUpon>
        </None>
    </ItemGroup>
    

    Related resources: