モッキング フレームワークを Rhino から FakeItEasy に切り替えることを検討しています。主な理由はシンプルさです。FakeItEasy では、物事を行う方法は 1 つしかありません。Rhino には、記録/再生、AAA、スタブ、部分モック、厳密モック、動的モックなどがあります。
FakeItEasy を使用していくつかのテストを書き直して、Rhino が現在行っているすべてのことを確実に実行できるようにしています。
Rhinoでは、次のテストがあります。コードは省略されています。
ConfigurationManagerBase configManager = _mocks.Stub<ConfigurationManagerBase>();
using( _mocks.Record() )
{
SetupResult
.For( configManager.AppSettings["ServerVersion"] )
.Return( "foo" );
}
このコードが添付されている単体テストは問題なく実行され、テストに合格します。FakeItEasy を使って次のように書き直しました。
ConfigurationManagerBase configManager = A.Fake<ConfigurationManagerBase>();
A.CallTo( () => configManager.AppSettings["ServerVersion"] )
.Returns( "foo" );
テストを実行すると失敗しますが、FakeItEasy が例外をスローしているためです。
The current proxy generator can not intercept the specified method for the following reason:
- Non virtual methods can not be intercepted.
Rhino にも同じ制限があるため、これは奇妙に思えました。AppSettings は ConfigurationManagerBase では仮想ですが、インデクサー プロパティはそうではありません。FakeItEasy テストを read に変更することで問題を修正しました。
NameValueCollection collection = new NameValueCollection();
collection.Add( "ServerVersion", "foo" );
A.CallTo( () => configManager.AppSettings )
.Returns( collection );
私は基本的に、私が FakeItEasy で何か間違ったことをしているのか、それとも Rhino がそのインデクサーを使用して舞台裏で何らかの「魔法」を実行しているのかを理解しようとしています。