課題
Visual Studio(VS) や Visual Studio Team Services(VSTS)で、以前はビルドできたFakesを使用した単体テストがビルドできなくなるケースがある。また、現在のVS2015では、.net 4.5 の単体テストを新規作成し、SystemにFakesを適用するとエラーが表示されてビルドできない。
背景
これまで VSでFakesを使用するとき、[ソリューションエクスプローラー]の参照から対象を右クリックしてFakesアセンブリに追加すると、それだけでFakesが使用できるようになった。しかし、アップデートによりコンパイラとプロジェクトの構成が変更になったためか、そのままではビルドできない場合がある。
また、以前ビルドできていたソースもビルドできなくなり、VSTSの自動ビルドもエラーとなる場合がある。
解決方法
Fakesフォルダの .fakes ファイルを編集して、Fakesの対象となるクラスを必要なクラスに限定する。また、SystemをFakesする場合、参照に mscolib.4.0.0.0.Fakes が含まれていなければ、ビルド後に参照を追加する。
手順
Fakes フォルダの各 .fakes ファイルに Diagnostic を指定して、StubやShimが作れないエラーが出力ウィンドウに表示されるようにする。これでビルドする。
<Fakes xmlns=”http://schemas.microsoft.com/fakes/2011/” Diagnostic=”true”>
出力を確認しながら不要な Stub や Shim が作られないようにする。すべて作られないようにするには Assembly の次に StubGeneration とShimGeneration を追加して、それぞれ Disable を指定する。
<Assembly Name=”System” Version=”4.0.0.0″/>
<StubGeneration Disable=”true” />
<ShimGeneration Disable=”true” />
StubやShimを作りたいクラスを指定するには、StubGenerationやShimGenerationに、Clear と Add を追加する。意味としては、Clearで一度全部削除して、Addで必要なクラスを追加する。System.DateTimeをFakesするには、mscorlibに追加する。
<Assembly Name=”mscorlib” Version=”4.0.0.0″ />
<StubGeneration Disable=”true” />
<ShimGeneration>
<Clear/>
<Add FullName=”System.DateTime!”/>
</ShimGeneration>
クラス名の指定は、FullNameで最後に ! をつける。つけないと例えばSystem.DateTimeKind なども対象になってしまうので注意する。
どのクラスがmscorlibに含まれるか?は[オブジェクトブラウザ]を使用すると簡単に確認できる。正常にStubやShimが作られているか?確認することもできる。
ビルド後にFakesで作成されたStubやShimが表示されないときは、[ソリューションエクスプローラー]で参照を追加する。ビルドすると、Fakesフォルダの隣にFakesAssembliesフォルダが作られているので、dllを参照に追加する。
これで Fakes を使用した単体テストがビルド・実行できるようになる。