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

时间:2011-02-15 19:29:05

标签: moq typeloadexception

我有以下设置代码:

MockOf<IObjectSet<Dummy>>().Setup(c => c.AddObject(dummy)).Verifiable();
MockOf<IObjectContextWrapper>().Setup(c => c.GetObjectSet<Dummy>()).Returns(MockOf<IObjectSet<Dummy>>().Object);

其中Dummy是空类定义,dummyDummyMockOf<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.Emitters.AbstractTypeEmitter.BuildType()
  在Castle.DynamicProxy.Generators.InterfaceProxyWithTargetGenerator.GenerateCode(类型proxyTargetType,Type []接口,ProxyGenerationOptions选项)
  在Castle.DynamicProxy.ProxyGenerator.CreateInterfaceProxyWithoutTarget(类型interfaceToProxy,Type [] additionalInterfacesToProxy,ProxyGenerationOptions选项,IInterceptor []拦截器)
  在Moq.Mock 1.<InitializeInstance>b__0()
at Moq.Mock
1.InitializeInstance()
  在Moq.Mock`1.get_Object()
  在RepositoryTest.cs中的OddEnds.Tests.Data.EntityFramework.RepositoryTest.Delete_DeletesObjectFromObjectSet():第43行

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

如何解决此问题?

3 个答案:

答案 0 :(得分:16)

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

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

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

以下是关于该主题的相关帖子

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

我希望这会有所帮助

答案 1 :(得分:12)

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

我的代码是这样的:

var mockMonitor = new Mock<ICacheMonitor<int, PrivateObject>>();

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

public class PrivateObject () {}

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

答案 2 :(得分:0)

我绊倒了另一个案件,起初我无法弄明白。我正在研究在我的单元测试中创建的接口的代理......

public IDoWork
{
    void DoWork();
}

我花了很长时间才弄清楚问题不是那个界面,而是单元测试本身不公开:

class TestSomething // missing public keyword
{

// .. some test which tries to create a mock of the interface


    public IDoWork
    {
        void DoWork();
    }

}

所以,虽然IDoWork公开说它是公开的,但实际上并非如此,因为它被包含在私人课堂中。

希望这有助于某人。