我正在尝试为单元测试创建一个模拟 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;
单元测试在最后一条语句失败
threw exception: System.ArgumentException: Unable to obtain public key for StrongNameKeyPair..
System.Reflection.StrongNameKeyPair.nGetPublicKey(Boolean exported, Byte[] array, String container) System.Reflection.StrongNameKeyPair.get_PublicKey() System.AppDomain.InternalDefineDynamicAssembly(AssemblyName name, AssemblyBuilderAccess access, String dir, Evidence evidence, PermissionSet requiredPermissions, PermissionSet optionalPermissions, PermissionSet refusedPermissions, StackCrawlMark& stackMark, IEnumerable`1 unsafeAssemblyAttributes) System.AppDomain.DefineDynamicAssembly(AssemblyName name, AssemblyBuilderAccess access) Castle.DynamicProxy.ModuleScope.CreateModule(Boolean signStrongName) Castle.DynamicProxy.ModuleScope.ObtainDynamicModuleWithStrongName() Castle.DynamicProxy.ModuleScope.ObtainDynamicModule(Boolean 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 实际上会尝试签署动态程序集,但会失败?
最佳答案
MoQ 使用 CaSTLe DynamicProxy 在运行时生成模拟。 Rhino Mocks 使用相同的库来实现相同的目的。如果你在这里检查:
http://ayende.com/Blog/archive/2006/06/09/UnableToObtainPublicKeyForStrongNameKeyPair.aspx
您会看到问题是对机器 key 存储的权限之一。无论运行测试的用户帐户是什么,都必须具有在商店中创建和删除 key 的权限。
您可以在此处找到有关此问题的更多详细信息:
http://groups.google.co.uk/group/RhinoMocks/browse_thread/thread/26df68ff01567509/5ddebf407228edc4
关于exception - 尝试使用 MoQ 时的 StrongNameKeyPair 问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2425667/