我正在尝试从Microsoft Sync Framework模拟一个类。它只有一个内部构造函数。当我尝试以下内容时:
var fullEnumerationContextMock = new Mock<FullEnumerationContext>();
我收到此错误:
System.NotSupportedException:Parent 没有默认构造函数。 默认构造函数必须是 明确定义。
这是堆栈跟踪:
System.Reflection.Emit.TypeBuilder.DefineDefaultConstructorNoLock(MethodAttributes 属性) System.Reflection.Emit.TypeBuilder.DefineDefaultConstructor(MethodAttributes 属性) System.Reflection.Emit.TypeBuilder.CreateTypeNoLock() System.Reflection.Emit.TypeBuilder.CreateType() Castle.DynamicProxy.Generators.Emitters.AbstractTypeEmitter.BuildType() Castle.DynamicProxy.Generators.ClassProxyGenerator.GenerateCode(类型[] 接口,ProxyGenerationOptions选项) Castle.DynamicProxy.DefaultProxyBuilder.CreateClassProxy(类型classToProxy,Type [] additionalInterfacesToProxy, ProxyGenerationOptions选项) Castle.DynamicProxy.ProxyGenerator.CreateClassProxyType(Type classToProxy,Type [] additionalInterfacesToProxy, ProxyGenerationOptions选项) Castle.DynamicProxy.ProxyGenerator.CreateClassProxy(类型classToProxy,Type [] additionalInterfacesToProxy, ProxyGenerationOptions选项,Object [] constructorArguments, IInterceptor []拦截器) Castle.DynamicProxy.ProxyGenerator.CreateClassProxy(类型classToProxy,Type [] additionalInterfacesToProxy, ProxyGenerationOptions选项,IInterceptor []拦截器) Castle.DynamicProxy.ProxyGenerator.CreateClassProxy(类型classToProxy,Type [] additionalInterfacesToProxy,IInterceptor [] 拦截器) Moq.Mock
1.<InitializeInstance>b__0() Moq.PexProtector.Invoke(Action action) Moq.Mock
1.InitializeInstance()
我该如何解决这个问题?
答案 0 :(得分:20)
您无法模拟没有公共构造函数的类型,因为Moq将无法实例化该类型的对象。根据您要测试的内容,您有以下几种选择:
答案 1 :(得分:4)
我不是Moq的专家,但我认为你需要指定构造函数的参数。在Rhino Mocks中,您可以像这样指定它们:
var fullEnumerationContextMock = new Mock<FullEnumerationContext>(arg1, arg2);
在Moq中可能类似。
答案 2 :(得分:2)
基于marcind的答案,我创建了一个界面(IFullEnumerationContext
),我嘲笑然后我有两个重载我试图测试的方法,一个接受FullEnumerationContext
和另一个IFullEnumerationContext
。它感觉不太好,但确实有效。欢迎任何更好的建议或改进。
public override void EnumerateItems(FullEnumerationContext context)
{
List<ItemFieldDictionary> listItemFieldDictionary = EnumerateItemsCommon();
context.ReportItems(listItemFieldDictionary);
}
public void EnumerateItems(IFullEnumerationContext context)
{
List<ItemFieldDictionary> listItemFieldDictionary = EnumerateItemsCommon();
context.ReportItems(listItemFieldDictionary);
}
答案 3 :(得分:1)
其实你可以。打开AssemblyInfo.cs文件并在结尾处添加以下行
[assembly: InternalsVisibleTo("DynamicProxyGenAssembly2")]
答案 4 :(得分:0)
在“被测系统”项目中,您需要:
protected internal
在SUT类中的构造函数可见性(例如FullEnumerationContext
) AssemblyInfo.cs
应该向测试项目公开其内部信息:
[assembly: InternalsVisibleTo("DynamicProxyGenAssembly2")]