AutoMock CreateInstance 要模拟的类型必须是接口、委托或非密封、非静态类

问题描述 投票:0回答:2

在嘲笑“autoMocker.CreateInstance();”时,我收到下面的通用消息与 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()
debugging autofac automocking
2个回答
2
投票

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

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

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


0
投票

就我而言,

<InternalsVisibleTo Include="DynamicProxyGenAssembly2" />
可以解决这个问题。

© www.soinside.com 2019 - 2024. All rights reserved.