我们正在考虑从我们的模拟框架转换到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在幕后使用该索引器执行了一些“魔术”?
答案 0 :(得分:0)
以下配置应该类似于Rhino所做的事情,如果这不起作用Rhino做了一些神奇的事情:
NextCall.To(configManager.AppSettings).Returns("foo");
var ignored = configManager.AppSettings["ServerVersion"];