6

我正在尝试为单元测试创​​建一个模拟 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(布尔导出,字节 [] 数组,字符串容器) System.Reflection.StrongNameKeyPair.get_PublicKey() System.AppDomain.InternalDefineDynamicAssembly(AssemblyName 名称,AssemblyBuilderAccess 访问,字符串目录,证据证据,PermissionSet requiredPermissions,PermissionSet optionalPermissions, PermissionSet deniedPermissions, 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 模块范围,字符串名称,类型(等等等等)

我用谷歌搜索,这里的建议似乎不起作用(更改 RSA 文件夹安全设置等)http://groups.google.com.br/group/castle-project-users/browse_thread/thread/85685cf32a795158

我认为这是正确的吗,因为HttpContextBaseSystem.Web.Abstraction是已签名程序集的一部分。Moq 实际上会尝试对动态程序集进行签名,但会失败?

4

3 回答 3

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

于 2010-03-11T14:37:58.027 回答
0

看看Scott Hanselman 的这篇博文——它有点老了,但他在那里展示的MvcMockHelpers可能会让你很好地了解如何完成你正在做的事情。

于 2010-03-11T14:30:54.353 回答
-1

您应该在 asp.net站点上观看此视频,该视频展示了一个惊人的实现示例。

于 2010-03-11T14:31:32.380 回答