Разница в поведении между Rhino и FakeItEasy - PullRequest
0 голосов
/ 26 августа 2011

Мы рассматриваем возможность перехода с 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 выполняет какую-то "магию" за кулисами сэтот индексатор?

1 Ответ

0 голосов
/ 30 августа 2011

Следующая конфигурация должна быть похожа на то, что делает Rhino, если это не работает Rhino делает что-то волшебное:

NextCall.To(configManager.AppSettings).Returns("foo"); 
var ignored = configManager.AppSettings["ServerVersion"];
...