【问题标题】:Why is real code being called in this test using RhinoMocks?为什么在这个测试中使用 RhinoMocks 调用真实代码?
【发布时间】: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


【解决方案1】:

据我所知,没有内置方法可以模拟静态扩展方法。 Moq 也是如此,我猜 RhinoMock 也是如此。当然,您可以创建包装器等,但我认为没有内置方式。这可能就是为什么你的代码即使通过它也能达到真正的扩展方法的原因。

public static bool IsRegistered<T>(this IUnityContainer container)
{
  Guard.ArgumentNotNull((object) container, "container");
  return UnityContainerExtensions.IsRegistered(container, typeof (T));
}

另请参阅此relevant 帖子。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-05-19
    • 1970-01-01
    • 1970-01-01
    • 2012-04-22
    • 1970-01-01
    • 2020-06-23
    • 1970-01-01
    相关资源
    最近更新 更多