我正在尝试为单元测试创建一个模拟HttpContextBase。
var fakePrinciple = new GenericPrincipal(
new GenericIdentity(userId),
rolesList.ToArray());
var mockHttpContext = new Mock<HttpContextBase>();
mockHttpContext.Setup(t => t.User).Returns(fakePrinciple);
HttpContextBase mockedContext = mockHttpContext.Object;
单元测试在
的最后一个语句处失败抛出异常: System.ArgumentException:无法执行 获取公钥 StrongNameKeyPair ..
System.Reflection.StrongNameKeyPair.nGetPublicKey(布尔 export,Byte [] array,String 容器) System.Reflection.StrongNameKeyPair.get_PublicKey() System.AppDomain.InternalDefineDynamicAssembly(的AssemblyName name,AssemblyBuilderAccess访问权限, String dir,证据证据, PermissionSet requiredPermissions, PermissionSet optionalPermissions, PermissionSet rejectedPermissions, StackCrawlMark&安培; stackMark, IEnumerable`1 unsafeAssemblyAttributes) System.AppDomain.DefineDynamicAssembly(的AssemblyName name,AssemblyBuilderAccess访问) Castle.DynamicProxy.ModuleScope.CreateModule(布尔 signStrongName) Castle.DynamicProxy.ModuleScope.ObtainDynamicModuleWithStrongName() Castle.DynamicProxy.ModuleScope.ObtainDynamicModule(布尔 isStrongNamed) Castle.DynamicProxy.Generators.Emitters.ClassEmitter.CreateTypeBuilder(ModuleScope modulescope,String name,Type (blah blah snip)
我用谷歌搜索,这里的建议似乎不起作用(更改RSA文件夹安全设置等)http://groups.google.com.br/group/castle-project-users/browse_thread/thread/85685cf32a795158
我认为这是正确的,因为HttpContextBase
是System.Web.Abstraction
的一部分,这是一个签名的程序集。 Moq实际上会尝试签署动态程序集,并且失败了吗?
答案 0 :(得分:10)
MoQ使用Castle DynamicProxy在运行时生成模拟。 Rhino Mocks使用相同的库来实现相同的目的。如果你在这里查看:
http://ayende.com/Blog/archive/2006/06/09/UnableToObtainPublicKeyForStrongNameKeyPair.aspx
您会看到问题是计算机密钥存储区的权限之一。无论运行什么用户帐户,测试都必须具有在商店中创建和删除密钥的权限。
您可以在此处找到有关此问题的更多详细信息: http://groups.google.co.uk/group/RhinoMocks/browse_thread/thread/26df68ff01567509/5ddebf407228edc4
答案 1 :(得分:0)
查看Scott Hanselman撰写的this blog post - 它有点旧了,但是他显示的 MvcMockHelpers 可能会让你很好地了解如何完成你正在做的事情。< / p>
答案 2 :(得分:-1)
您应该观看显示实施示例的this video on asp.net网站。