Visual Studio 2015 / Visual Studio Team Servicesで Fakesを使った単体テストがビルドできないときは、Fakesフォルダのmscorlib.fakesファイルを必要なクラスだけに絞り、参照にmscorlib.4.0.0.0.Fakesを追加

課題

Visual Studio(VS) や Visual Studio Team Services(VSTS)で、以前はビルドできたFakesを使用した単体テストがビルドできなくなるケースがある。また、現在のVS2015では、.net 4.5 の単体テストを新規作成し、SystemにFakesを適用するとエラーが表示されてビルドできない。

背景

これまで VSでFakesを使用するとき、[ソリューションエクスプローラー]の参照から対象を右クリックしてFakesアセンブリに追加すると、それだけでFakesが使用できるようになった。しかし、アップデートによりコンパイラとプロジェクトの構成が変更になったためか、そのままではビルドできない場合がある。

https://blogs.msdn.microsoft.com/harshjain/2016/12/29/generating-fakes-assembly-for-system-dll-for-test-project/

また、以前ビルドできていたソースもビルドできなくなり、VSTSの自動ビルドもエラーとなる場合がある。

解決方法

Fakesフォルダの .fakes ファイルを編集して、Fakesの対象となるクラスを必要なクラスに限定する。また、SystemをFakesする場合、参照に mscolib.4.0.0.0.Fakes が含まれていなければ、ビルド後に参照を追加する。

clip_image001

 

 

手順

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 なども対象になってしまうので注意する。

clip_image001[4]

どのクラスがmscorlibに含まれるか?は[オブジェクトブラウザ]を使用すると簡単に確認できる。正常にStubやShimが作られているか?確認することもできる。

clip_image001[6]

ビルド後にFakesで作成されたStubやShimが表示されないときは、[ソリューションエクスプローラー]で参照を追加する。ビルドすると、Fakesフォルダの隣にFakesAssembliesフォルダが作られているので、dllを参照に追加する。

clip_image001[8]

これで Fakes を使用した単体テストがビルド・実行できるようになる。