Мы рассматриваем возможность перехода с Rhino на FakeItEasy для нашей среды для насмешек.Основная причина - простота, в FakeItEasy есть только один способ сделать что-то.У 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, а свойство indexer - нет.Мы исправили проблему, изменив тест FakeItEasy следующим образом:
NameValueCollection collection = new NameValueCollection();
collection.Add( "ServerVersion", "foo" );
A.CallTo( () => configManager.AppSettings )
.Returns( collection );
Я просто пытаюсь понять, что я делаю что-то не так с FakeItEasy, или Rhino выполняет какую-то "магию" за кулисами сэтот индексатор?