【问题标题】:Rhino Mocks, assert that a MockRepository was not used (methods)?Rhino Mocks,断言没有使用 MockRepository(方法)?
【发布时间】:2013-09-25 08:46:11
【问题描述】:

有没有办法断言在 MockRepository 中没有调用任何方法?

说我有:

var repo = MockRepository.GenerateStub<RealRepo>();

我知道我能做到:

repo.AssertWasNotCalled(...);

但是有没有办法检查它是否未被使用?而不是每次我想检查是否未使用 repo 时都执行所有方法?

在某些情况下,我只想检查我是否不使用此 repo。

【问题讨论】:

  • 如果没有调用,就没有使用。如果它被调用,它就会被使用。

标签: c# unit-testing rhino-mocks


【解决方案1】:

使用 StrictMock 代替存根:

var repo = MockRepository.GenerateStrictMock<RealRepo>();

如果你尝试调用任何没有设置的成员,它会抛出异常。


顺便说一句,起订量也是如此:

var repoMock = new Mock<RealRepo>(MockBehavior.Strict);

【讨论】:

  • 谢谢!这实际上奏效了,即使我不得不稍微移动一下测试用例,但它确实给了我想要的功能:)
【解决方案2】:

您可以尝试将自己的扩展添加到 Rhino Mocks。像这样的:

    public static void AssertNothingWasCalled<T>(this T mock)
    {
        var methodsToVerify = typeof (T)
            .GetMethods()
            .Where(m => !m.IsSpecialName);

        foreach (var method in methodsToVerify)
        {
            var arguments = BuildArguments(method);
            var action = new Action<T>(x => method.Invoke(x, arguments));
            mock.AssertWasNotCalled(action, y => y.IgnoreArguments());
        }
    }

    private static object[] BuildArguments(MethodInfo methodInfo)
    {
        return methodInfo
            .GetParameters()
            .Select(p => Arg<object>.Is.Anything)
            .ToArray();
    }

但是the answer by Sergey Berezovskiy 似乎更简单一些。

【讨论】:

    【解决方案3】:

    也许最简单的做法是将空引用传递给调用类。如果您的 SUT 尝试使用它,它应该抛出一个 NullReferenceException。这可能是最简单的方法。

    但是,如果 SUT 检查是否为 null,那么这将不起作用。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-08-28
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多