Moq:Mock.Verify()抛出NullReferenceException

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Moq:Mock.Verify()抛出NullReferenceException相关的知识,希望对你有一定的参考价值。

我有一些简单的界面,我正在写一个简单的单元测试,调用它的Mock<>

public interface IMy() {
  void Method(ISomething foo, byte[] bar);
}

var mock = new Mock<IMy>;
// ...
mock.Verify(m => m.Method(It.IsAny<ISomething>(), It.IsAny<byte[]>()), Times.Exactly(10));

但是,Verify抛出以下异常:

System.NullReferenceException: Object reference not set to an instance of an object.
   at System.Linq.Enumerable.<OfTypeIterator>d__92`1.MoveNext()
   at System.Linq.Enumerable.WhereSelectEnumerableIterator`2.MoveNext()
   at System.String.Join(String separator, IEnumerable`1 values)
   at Moq.Extensions.GetValue(Object value)
   at Moq.Extensions.<>c.<Format>b__1_1(Object a)
   at System.Linq.Enumerable.WhereSelectArrayIterator`2.MoveNext()
   at System.Linq.Buffer`1..ctor(IEnumerable`1 source)
   at System.Linq.Enumerable.ToArray[TSource](IEnumerable`1 source)
   at Moq.Extensions.Format(ICallContext invocation)
   at Moq.Mock.<>c.<FormatInvocations>b__63_0(ICallContext i)
   at System.Linq.Enumerable.WhereSelectListIterator`2.MoveNext()
   at System.Linq.Buffer`1..ctor(IEnumerable`1 source)
   at System.Linq.Enumerable.ToArray[TSource](IEnumerable`1 source)
   at Moq.Mock.FormatInvocations(IEnumerable`1 invocations)
   at Moq.Mock.ThrowVerifyException(MethodCall expected, IEnumerable`1 setups, IEnumerable`1 actualCalls, Expression expression, Times times, Int32 callCount)
   at Moq.Mock.VerifyCalls(Interceptor targetInterceptor, MethodCall expected, Expression expression, Times times)
   at Moq.Mock.Verify[T,TResult](Mock`1 mock, Expression`1 expression, Times times, String failMessage)
   at Moq.Mock`1.Verify[TResult](Expression`1 expression, Times times)

调试器在这里找到null究竟是什么并没什么帮助。有没有人用Moq库遇到它?

答案

最终问题是Moq内部使用了mock的IEnumerable实现。在库的未来版本中,错误消息和前置条件检查得到了改进。

请参阅以下讨论以供参考:

第一个错误 - 堆栈跟踪不同但根本原因:https://github.com/moq/moq4/issues/169

第二个错误 - 相同的堆栈跟踪:https://github.com/moq/moq4/issues/464

当它是一个开源故障时,最好检查一下库Github。

以上是关于Moq:Mock.Verify()抛出NullReferenceException的主要内容,如果未能解决你的问题,请参考以下文章

如何验证在 Moq 中没有调用该方法?

Moq:测试是否抛出异常

Lambda查询抛出对象不包含错误,同时通过`MOQ`设置来获取动态类型的数据

Moq:设置一个模拟方法在第一次调用时失败,在第二次调用时成功

初学 Moq

如何使用MOQ进行单元测试