【发布时间】:2015-07-17 07:35:22
【问题描述】:
我在 Visual Studio 2013 中使用最新的 Moq (4.2.1502.911) 来模拟另一个项目中包含的内部接口。两个项目都使用相同的密钥进行签名。在网上和其他地方搜索后,我想我必须使用 Moq 的公钥为测试程序集和“DynamicProxyGenAssembly2”添加 InternalsVisibleTo,如下所示:
[assembly: InternalsVisibleTo("UnitTestProject1, PublicKey=00240000048000009...
[assembly: InternalsVisibleTo("DynamicProxyGenAssembly2, PublicKey=002400000...
现在,当我运行我的测试方法时,我仍然收到以下错误:
Test Name: TestMethod1
Test FullName: UnitTestProject1.Class1Test.TestMethod1
Test Source: c:\Users\******\Documents\Visual Studio 2013\Projects\MoqTest\UnitTestProject1\UnitTest1.cs : line 13
Test Outcome: Failed
Test Duration: 0:00:00,0693592
Result Message:
Test method UnitTestProject1.Class1Test.TestMethod1 threw exception:
System.TypeLoadException: Le type 'Castle.Proxies.IFooProxy' de l'assembly 'DynamicProxyGenAssembly2, Version=0.0.0.0, Culture=neutral, PublicKeyToken=a621a9e7e5c32e69' essaye d'implémenter une interface inaccessible.
Result StackTrace:
à System.Reflection.Emit.TypeBuilder.TermCreateClass(RuntimeModule module, Int32 tk, ObjectHandleOnStack type)
à System.Reflection.Emit.TypeBuilder.CreateTypeNoLock()
à System.Reflection.Emit.TypeBuilder.CreateType()
à Castle.DynamicProxy.Generators.Emitters.AbstractTypeEmitter.CreateType(TypeBuilder type)
à Castle.DynamicProxy.Generators.Emitters.AbstractTypeEmitter.BuildType()
à Castle.DynamicProxy.Generators.InterfaceProxyWithoutTargetGenerator.GenerateType(String typeName, Type proxyTargetType, Type[] interfaces, INamingScope namingScope)
à Castle.DynamicProxy.Generators.InterfaceProxyWithTargetGenerator.<>c__DisplayClass1.<GenerateCode>b__0(String n, INamingScope s)
à Castle.DynamicProxy.Generators.BaseProxyGenerator.ObtainProxyType(CacheKey cacheKey, Func`3 factory)
à Castle.DynamicProxy.Generators.InterfaceProxyWithTargetGenerator.GenerateCode(Type proxyTargetType, Type[] interfaces, ProxyGenerationOptions options)
à Castle.DynamicProxy.DefaultProxyBuilder.CreateInterfaceProxyTypeWithoutTarget(Type interfaceToProxy, Type[] additionalInterfacesToProxy, ProxyGenerationOptions options)
à Castle.DynamicProxy.ProxyGenerator.CreateInterfaceProxyWithoutTarget(Type interfaceToProxy, Type[] additionalInterfacesToProxy, ProxyGenerationOptions options, IInterceptor[] interceptors)
à Moq.Proxy.CastleProxyFactory.CreateProxy(Type mockType, ICallInterceptor interceptor, Type[] interfaces, Object[] arguments)
à Moq.Mock`1.<InitializeInstance>b__2()
à Moq.PexProtector.Invoke(Action action)
à Moq.Mock`1.InitializeInstance()
à Moq.Mock`1.OnGetObject()
à Moq.Mock`1.get_Object()
à UnitTestProject1.Class1Test.TestMethod1() dans c:\Users\******\Documents\Visual Studio 2013\Projects\MoqTest\UnitTestProject1\UnitTest1.cs:ligne 15
(英文:System.TypeLoadException : Type 'Castle.Proxies.IFooProxy' from assembly 'DynamicProxyGenAssembly2, Version=0.0.0.0, Culture=neutral, PublicKeyToken=a621a9e7e5c32e69' is attempting to implement an inaccessible interface.)
还有其他事情可以做吗? 这是一个最小的可编译示例:https://www.dropbox.com/s/c2slwq4do5ttp9p/MoqTest.zip?dl=0
【问题讨论】:
-
你不能从内部接口派生出来...下面的问题stackoverflow.com/questions/8606412/…可能会给你一些希望...
-
不正确,这就是 InternalsVisibleToAttribute 的用途。当程序集未签名时,上述方法有效。
-
所以你可以改变“另一个”项目——没有意识到这一点。请注意,您的示例显示与错误不同的公钥...通常测试/代理程序集未签名 - 您可能需要实际手动构建使用正确密钥签名的代理才能正常工作。