Configuring Fakes
What:
Fakes exposes some configuration options through .fakes file which is part of your solution. However, beyond this file there are some other options as well that are understood by the fakes engine. These options are not documented anywhere, so this blog describes some of those extra options which can be used to configure/override the default behavior of Fakes beyond what is provided by the .fakes file.
How:
To use the below options, locate your fakes targets file from a location like : "C:\Program Files (x86)\MSBuild\Microsoft\VisualStudio\v12.0\Fakes\Microsoft.QualityTools.Testing.Fakes.targets". Note that while some of the properties like TargetFrameworkversion are directly exposed, some others like msbuildpath are passed to the FakesEngine via FakesCommandLineArguments like this :
<FakesCommandLineArguments>$(FakesCommandLineArguments) /msbuildpath:"$(FakesMSBuildPath)"</FakesCommandLineArguments>
Glossary:
Configuration Option |
PropertyName to Use |
Description |
Possible Values |
Default Value |
Available In Fakes file |
|
|
|
|
|
|
TargetFrameworkVersion |
TargetFrameworkVersion |
Target DotNet framework version with which fakes assemblies should get compiled with. |
A valid DotNet version |
v4.5 |
Yes |
TargetRuntimeVersion |
TargetRuntimeVersion |
CLR Runtime version to be used (corresponding fakes engine executable is invoked) |
v4.0.30319, v2.0.50727 |
v4.0.30319 |
No |
ToolsVersion |
FakesCommandLineArguments with "/tv" |
Build Toolset version to be used for creating fakes assemblies. |
A valid toolset version |
v4.0 |
No |
Debug |
FakesCommandLineArguments with "/d" |
Generate the fakes assembly with 'debug' configuration. |
NA |
False. ie. Build Configuration is set to Release. |
Yes |
Properties |
FakesCompilationProperties |
Semicolon separated list of project properties to be set in the fakes project. |
Format : <property name1>=<property value1>;<property name2>=<property value2>; |
None |
Yes |
KeyFile |
FakesCommandLineArguments with "/key:<filepath>" |
Path to the KeyFile for signing the fakes assembly. |
<filepath> |
None |
Yes |
ProjectTemplate |
FakesCommandLineArguments with "/pt:<projfilepath>" |
Path to a .proj file which will be used as a template for creating fakes assembly's.proj file. This option can be used to further customize fakes code generation if the rest of the options don’t suffice. For ex. Add a prebuild/postbuild event for the fakes assembly. Attaching a basic sample template to start with. <<ProjectTemplate.csproj>> |
<proj file path> |
None |
Yes |
MsbuildPath |
FakesMsbuildPath |
Path to the msbuild executable to be used for compiling fakes assemblies |
<msbuild executable file path> |
As specified by $MSBuildToolsPath |
No |
FrameworkPath |
FakesBinPath |
Directory Path where Microsoft.QualityTools.Testing.Fakes.dll is present |
<directory path> |
"C:\Program Files (x86)\MSBuild\Microsoft\ VisualStudio\v12.0\Fakes" |
No |
OutputPath |
FakesOutputPath |
Path to be used for dumping the generated fakes assemblies after copying them from intermediate path |
<directory path> |
<currentdirectory>\ FakesAssemblies |
No |
IntermediatePath |
FakesIntermediatePath |
Path to be used for dumping the intermediate code generated during creating fakes assemblies |
<directory path> |
<currentdirectory>\obj |
No |
CleanIntermediatePath |
FakesCommandLineArguments with "/clean" |
Delete the intermediate code that gets generated during fakes creation. |
NA |
False |
No |
ForceIntermediatePath (depcrecated) |
FakesCommandLineArguments with "/fip" |
Normally for each assembly, a folder is created under the intermediate path using the assembly name. If this option is set, the folder creation for each assembly does not happen, and instead the same folder is shared for all assemblies. |
NA |
False |
No |
ForceReadOnly |
FakesCommandLineArguments with "/f" |
If during fakes code generation or fakes compilation a file already exists as readonly, it won't get overwritten. Setting this option to true will ensure all readonly files are replaced. |
NA |
False |
No |
TargetX86 |
ForceX86 |
Force fakes engine to run as 32-bit process. Ideally the bitness is automatically determined from the assembly to be faked. |
NA |
Bitness as specified by the assembly to be faked |
Yes |
Elevated |
FakesCommandLineArguments with "/admin" |
Launch Fakes engine as elevated process. Ideally, if the invoking process is elevated, fakes process will automatically be launched elevated. |
NA |
Invoking process' elevation state |
No |
FakesFilesOnly |
FakesCommandLineArguments with "/mfo" |
Let's fakes accept only .fakes file, instead of accepting a .dll directly. |
NA |
False |
No |
ProcessCount |
FakesCommandLineArguments "/pc:<integer>" |
Number of concurrent fakes processes to spawn for generating Fakes. Ideally, if multiple assemblies are to be faked, fakes will automatically figure out and spawn the appropriate number of parallel processes based on machine's CPU Cores. This option can let you tune (lower) this value if required. |
<integer> |
Minimum of{Number of CPU Cores, Number of fakes assemblies to be generated} |
No |
Leaf |
FakesCommandLineArguments with "/l" |
There are situations when the fakes engine needs to re-launch itself under a different environment to suite the Bitness/CLR/Elevation requirements. In some cases this might lead to an infinite invocation loop. This option can be used to avoid fakes re-launch itself to avoid ending up in such a situation. |
NA |
False |
No |
Verbosity |
FakesVerbosity |
Verbosity level of Fakes engine. |
Critical|Error|Warning| Message|Verbose|Noisy |
Message |
Yes |
NamespaceFilter |
FakesCommandLineArguments with "/nf:<filterstring>" |
Filter out namespaces while generating stubs and shims |
<filter string> |
No filter |
Yes |
TypeFilter |
FakesCommandLineArguments with "/tf:<filterstring> |
Filter out types while generating stubs and shims |
<filter string> |
No filter |
Yes |
DisableStubs |
FakesCommandLineArguments with "/nostubs" |
Disable generation of stubs |
<filter string> |
False |
Yes |
DisableShims |
FakesCommandLineArguments with "/noshims" |
Disable generation of shims |
<filter string> |
False |
Yes |
AssemblyHash |
FakesCommandLineArguments with "/ah:<hash string>" |
Pass an assembly hash string, to determine if fakes code generation and fakes compilation should be skipped. |
<string> |
Null. |
No |
CompilationHash |
FakesCommandLineArguments with "/ch:<hash string>" |
Pass an assembly hash string, to determine if fakes compilation should be skipped. |
<string> |
Null. |
No |
ForceGeneration |
FakesCommandLineArguments with "/fg" |
Overrides all hash-validation checks which skip fakes generation and generates fakes forcefully. |
NA |
No |
No |
ReferenceAssemblies |
FakesCommandLineArguments with "/r:<syntax>" |
Semicolon separated list of all assembly paths that are required for resolving dependencies of the fakes assembly. Path can contain environment variables. |
Format : <assembly's fully qualified name>|<assembly's file path>. Ex: /r:ClassLibrary1, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null| C:\Release\ClassLibrary1.dll |
None |
Yes |
ComReferences |
FakesCommandLineArguments with "/comr:<syntax>" |
Path of COM references that are required for generating the fakes assembly. |
-do- |
None |
No |
DisableCodeContracts |
FakesCommandLineArguments with "/nocc" |
Skip Code Contracts during runtime instrumentation. This might be required when there are any issues with CodeContracts. |
NA |
False |
Yes |
NoLogo |
FakesCommandLineArguments with "/n" |
Disables emitting Fakes logo and copyright information |
NA |
False |
No |
Note:
You will see that some of the options are available via both places (.fakes file and .targets file). Avoid a situation where your configurations are setup in a conflicting way in both places.