有没有办法断言在 MockRepository 中没有调用任何方法?
说我有:
var repo = MockRepository.GenerateStub<RealRepo>();
我知道我可以做到:
repo.AssertWasNotCalled(...);
但是有没有办法检查它是否未被使用?而不是每次我想检查是否未使用回购时都执行所有方法?
在某些情况下,我只想检查我是否不使用此存储库。
有没有办法断言在 MockRepository 中没有调用任何方法?
说我有:
var repo = MockRepository.GenerateStub<RealRepo>();
我知道我可以做到:
repo.AssertWasNotCalled(...);
但是有没有办法检查它是否未被使用?而不是每次我想检查是否未使用回购时都执行所有方法?
在某些情况下,我只想检查我是否不使用此存储库。
使用 StrictMock 代替存根:
var repo = MockRepository.GenerateStrictMock<RealRepo>();
如果您尝试调用任何没有设置的成员,它将引发异常。
顺便说一句,起订量也是如此:
var repoMock = new Mock<RealRepo>(MockBehavior.Strict);
您可以尝试将自己的扩展添加到 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();
}
但是Sergey Berezovskiy 的回答似乎更简单一些。
也许最简单的做法是将 null ref 传递给调用类。NullReferenceException
如果您的 SUT 尝试使用它,它应该抛出一个。这可能是最简单的方法。
但是,如果 SUT 检查是否为空,那么这将不起作用。