尝试使用Moq模拟IObjectSet时出现TypeLoadException

Tom*_*han 17 typeloadexception moq

我有以下设置代码:

MockOf<IObjectSet<Dummy>>().Setup(c => c.AddObject(dummy)).Verifiable();
MockOf<IObjectContextWrapper>().Setup(c => c.GetObjectSet<Dummy>()).Returns(MockOf<IObjectSet<Dummy>>().Object);
Run Code Online (Sandbox Code Playgroud)

其中Dummy是一个空类定义,dummy是一个Dummy.MockOf<T>()是基类上的模拟管理功能,它基本上确保每次在类型上调用它时,它返回相同的模拟实例.

包含此设置代码的测试失败,TypeLoadException并显示以下消息:

System.TypeLoadException:从程序集'DynamicProxyGenAssembly2,Version = 0.0.0.0,Culture = neutral,PublicKeyToken = a621a9e7e5c32e69'输入'IObjectSet`1Proxy389e220f10aa4d9281d0b9e136edc1d4'试图实现一个不可访问的接口.

在System.Reflection.Emit.TypeBuilder.TermCreateClass(RuntimeModule模块,Int32 tk,ObjectHandleOnStack类型)
的System.Reflection.Emit.TypeBuilder.CreateTypeNoLock()
在System.Reflection.Emit.TypeBuilder.CreateType()
在Castle.DynamicProxy.Generators Castle.DynamicProxy.Generators.InterfaceProxyWithTargetGenerator.GenerateCode(
类型为proxyTargetType,Type []接口,ProxyGenerationOptions选项)
的.Emitters.AbstractTypeEmitter.BuildType()在Castle.DynamicProxy.ProxyGenerator.CreateInterfaceProxyWithoutTarget(类型interfaceToProxy,Type [] additionalInterfacesToProxy,ProxyGenerationOptions选项, IInterceptor []拦截器)
在Moq.Mock 1.InitializeInstance() 在Moq.Mock`1.get_Object()1.<InitializeInstance>b__0()
at Moq.Mock


在RepositoryTest.cs中的OddEnds.Tests.Data.EntityFramework.RepositoryTest.Delete_DeletesObjectFromObjectSet():第43行

我已System.Data.Objects在测试项目和正在测试的类所在的项目中导入并引用了System.Data.Entity.dll和Microsoft.Data.Entity.CTP.dll.构建成功,没有错误,警告或消息(除了一些与代码合同有关的...)

我该如何解决?

Bri*_*haw 16

您在测试中使用的任何接口或类是否在内部?你是否正在使用类似的[assembly: InternalsVisibleTo("YourTestAssembly")]东西来编译?

如果是这样,您还需要为DynamicProxyGenAssembly2添加一个,以便Moq动态生成类的代理.

//goes in the AssemblyInfo.cs where the internal interfaces / classes are defined
[assembly: InternalsVisibleTo("DynamicProxyGenAssembly2")]  
Run Code Online (Sandbox Code Playgroud)

这是关于该主题的相关帖子

http://sonofpirate.blogspot.com/2009/09/my-first-foray-into-unit-testing-with.html

我希望这有帮助

  • 我今天一直在谷歌搜索这个问题很长一段时间.通常这应该有效,这也写在官方moq网站http://code.google.com/p/moq/wiki/QuickStart上.但它对我不起作用.它与moq使用的最新版库有关.我找到了这篇文章 - http://stackoverflow.com/questions/4156499/castle-windsor-internalsvisibleto-silverlight并添加InternalsVisibleTo Castle.Core和Castle.Windsor(当然还有DynamicProxyGenAssembly2)就可以了.PS:我在嘲笑内部界面 (3认同)

The*_*tor 12

我发现在我的情况下,我创建了一个Dummy类实例,用于我的单元测试,这个实例恰好是私有的(因为我真的不想在外面共享测试对象).

我的代码是这样的:

var mockMonitor = new Mock<ICacheMonitor<int, PrivateObject>>();
Run Code Online (Sandbox Code Playgroud)

其中PrivateObject是我的TestClass中的私有类定义.因此,我的修复是为了确保Mock构造函数中的任何类型都是公共的.

public class PrivateObject () {}
Run Code Online (Sandbox Code Playgroud)

(显然我不会将我的公共对象称为PrivateObject ...)