我有以下设置代码:
MockOf<IObjectSet<Dummy>>().Setup(c => c.AddObject(dummy)).Verifiable();
MockOf<IObjectContextWrapper>().Setup(c => c.GetObjectSet<Dummy>()).Returns(MockOf<IObjectSet<Dummy>>().Object);
其中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.Emitters.AbstractTypeEmitter.BuildType()
在Castle.DynamicProxy.Generators.InterfaceProxyWithTargetGenerator.GenerateCode(类型proxyTargetType,Type []接口,ProxyGenerationOptions选项)
在Castle.DynamicProxy.ProxyGenerator.CreateInterfaceProxyWithoutTarget(类型interfaceToProxy,Type [] additionalInterfacesToProxy,ProxyGenerationOptions选项,IInterceptor []拦截器)
在Moq.Mock1.<InitializeInstance>b__0()
1.InitializeInstance()
at Moq.Mock
在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。构建成功,没有错误,警告或消息(除了一些与代码约定相关的...)
如何解决此问题?
答案 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公开说它是公开的,但实际上并非如此,因为它被包含在私人课堂中。
希望这有助于某人。