Rhino和FakeItEasy之间行为的差异

时间:2011-08-25 23:09:52

标签: rhino-mocks fakeiteasy

我们正在考虑从我们的模拟框架转换到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.

这看起来很奇怪,因为犀牛有同样的限制。我们认为发生的事情是AppSettings在ConfigurationManagerBase上是虚拟的,索引器属性不是。我们通过将FakeItEasy测试更改为读取来纠正问题。

NameValueCollection collection = new NameValueCollection();
collection.Add( "ServerVersion", "foo" );

A.CallTo( () => configManager.AppSettings )
    .Returns( collection );

我基本上只是想了解我是否对FakeItEasy做错了,还是Rhino在幕后使用该索引器执行了一些“魔术”?

1 个答案:

答案 0 :(得分:0)

以下配置应该类似于Rhino所做的事情,如果这不起作用Rhino做了一些神奇的事情:

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