【发布时间】:2013-11-12 08:00:41
【问题描述】:
我有以下测试:
IUnityContainer unityContainer = MockRepository.GenerateStrictMock<IUnityContainer>();
unityContainer.Expect(c => c.IsRegistered<IServiceContainerRegistrar>()).Return(true).Repeat.Once();
据我所知,我正在创建 IUnityContainer 的模拟,并告诉他当有人调用 IsRegistered 方法时要返回什么。
我收到以下异常:
Test method CommonInitializerTest.CommonInitializer_Initialize_WorksOnce threw exception:
System.InvalidOperationException: Previous method 'IEnumerator.MoveNext();' requires a return value or an exception to throw.
使用以下堆栈跟踪:
at System.Linq.Enumerable.FirstOrDefault(IEnumerable`1 source)
at Microsoft.Practices.Unity.UnityContainerExtensions.IsRegistered(IUnityContainer container, Type typeToCheck, String nameToCheck)
at Microsoft.Practices.Unity.UnityContainerExtensions.IsRegistered(IUnityContainer container, Type typeToCheck)
at Microsoft.Practices.Unity.UnityContainerExtensions.IsRegistered(IUnityContainer container)
at Drives.Services.Common.Tests.CommonInitializerTest.<CommonInitializer_Initialize_WorksOnce>b__0(IUnityContainer c) in CommonInitializerTest.cs: line 50
at Rhino.Mocks.RhinoMocksExtensions.Expect(T mock, Function`2 action)
所以 Expect 正在调用真正的代码,因为我没有嘲笑 Unity 使用的所有内容,所以它失败了。为什么RhinoMock在注册期望的时候会执行真实的代码??????
【问题讨论】:
-
如何将存根统一容器分配给被测系统。您能否在单元测试中提供更多代码,显然隐藏了您不希望发布的任何内容?也只需检查 isRegistered 是否真的可以模拟,即可能是一个不可模拟的静态 ext 方法。
-
您需要发布您的扩展方法。看起来其中的某些代码正在对您的模拟容器使用 linq 表达式。
-
@Raj:也许你写了解决方案。因为它是一种扩展方法,所以它可能不能被嘲笑吧?
-
@TheCodeKing:我知道,但是当我注册一个期望时,我惊讶地发现调用了真正的扩展方法。
-
您是,但看起来您还没有发布其他一些使用 linq 的代码。当您使用严格的模拟时,这需要额外的期望。运行的不是真正的代码,它是由对未模拟的接口的额外调用引起的。
标签: c# .net unit-testing mocking rhino-mocks