0

模拟“autoMocker.CreateInstance<HeliumController>();”时,我收到以下通用消息 与 Moq.AutoMock.Automocker。HeliumController 类的构造函数有几个接口。如何找到无法模拟的特定接口或构造函数?

{System.Reflection.TargetInvocationException: Exception has been thrown by the target of an invocation.
 ---> System.NotSupportedException: Type to mock must be an interface, a delegate, or a non-sealed, non-static class.
   at Moq.Guard.IsMockable(Type type)
   at Moq.Mock`1..ctor(MockBehavior behavior, Object[] args)
   at Moq.Mock`1..ctor(MockBehavior behavior)
   --- End of inner exception stack trace ---
   at System.RuntimeMethodHandle.InvokeMethod(Object target, Object[] arguments, Signature sig, Boolean constructor, Boolean wrapExceptions)
   at System.Reflection.RuntimeConstructorInfo.Invoke(BindingFlags invokeAttr, Binder binder, Object[] parameters, CultureInfo culture)
   at System.RuntimeType.CreateInstanceImpl(BindingFlags bindingAttr, Binder binder, Object[] args, CultureInfo culture)
   at System.Activator.CreateInstance(Type type, BindingFlags bindingAttr, Binder binder, Object[] args, CultureInfo culture, Object[] activationAttributes)
   at System.Activator.CreateInstance(Type type, Object[] args)
   at Moq.AutoMock.Resolvers.MockResolver.Resolve(MockResolutionContext context)
   at Moq.AutoMock.AutoMocker.Resolve(Type serviceType, Object initialValue)
   at Moq.AutoMock.AutoMocker.Resolve(Type serviceType)
   at Moq.AutoMock.AutoMocker.Get(Type serviceType)
   at Moq.AutoMock.AutoMocker.<CreateArguments>b__58_0(ParameterInfo x)
   at System.Linq.Enumerable.SelectArrayIterator`2.ToArray()
   at System.Linq.Enumerable.ToArray[TSource](IEnumerable`1 source)
   at Moq.AutoMock.AutoMocker.CreateArguments(Type type, BindingFlags bindingFlags)
   at Moq.AutoMock.AutoMocker.CreateInstance(Type type, Boolean enablePrivate)
   at Moq.AutoMock.AutoMocker.CreateInstance[T](Boolean enablePrivate)
   at Moq.AutoMock.AutoMocker.CreateInstance[T]()
   at Helium.Api.Tests.API.v2.HeliumControllerSearchTests..ctor()
4

1 回答 1

2

不幸的是,这将是一些试验和错误,查看构造函数采用的类型,然后查看其中是否有任何不符合要求 - 我首先开始查看您正在使用的密封类,因为这可能是原因。接口、非密封、非静态和委托——这些都可以被模拟。

我确实注意到您在异常中没有任何行号。我收集的东西可能会在“发布”模式下进行测试,因此符号不可用。通常“调试”模式下的异常堆栈具有发生异常的实际行号 - 它可能有助于在“调试”模式下编译和运行测试以查看实际行。那可以缩小范围。

这是在 Moq 中引发不可模拟异常的地方。看起来他们可以很容易地将实际类型名称添加到异常中,只是没有发生。如果我是你,我会向 Moq 人员提出问题,并要求他们更新以在异常中包含类型名称。如果他们对此表示同意,那么提交给他们并让产品变得更好,同时解决您的问题似乎是一个非常简单的拉取请求。

于 2020-12-01T15:18:56.880 回答