2010-03-11 20 views
5

我想爲單元測試創​​建一個模擬HttpContextBase。StrongNameKeyPair問題當試圖使用MoQ

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 refusedPermissions, StackCrawlMark & stackMark, IEnumerable`1 unsafeAssemblyAttributes) System.AppDomain。 DefineDynamicAssembly(的AssemblyName 名,AssemblyBuilderAccess訪問) Castle.DynamicProxy.ModuleScope.CreateModule(布爾 signStrongName) Castle.DynamicProxy.ModuleScope.ObtainDynamicModuleWithStrongNam E() Castle.DynamicProxy.ModuleScope.ObtainDynamicModule(布爾 isStrongNamed) Castle.DynamicProxy.Generators.Emitters.ClassEmitter.CreateTypeBuilder(ModuleScope modulescope,字符串名稱,類型 (等等等等SNIP)

我一派,這裏的建議似乎不工作(其他城市RSA文件夾的安全設置等)http://groups.google.com.br/group/castle-project-users/browse_thread/thread/85685cf32a795158

我是正確地認爲,因爲HttpContextBaseSystem.Web.Abstraction一部分,這是一個簽名的程序集。 Moq實際上會嘗試簽署動態程序集,並失敗?

+0

FWIW,我已經使用起訂量來模擬HttpContextBase很多次,從來沒有這個問題。無論你的問題是什麼,Moq和HttpContextBase的組合並不是一般的。 – 2010-03-11 14:32:16

+0

訣竅是需要在MachineKeys文件夾而不是RSA上設置權限。如果你不是讀者,那麼Ayende的這篇文章並沒有讓這一點變得完全明顯。 – 2011-07-21 10:52:51

+0

很高興我找到了這個,呃,兩天,終於修好了:D。只是想添加一些幫助我的參考資料,以防其他人遇到這種情況: http://ansaurus.com/question/3154345-strong-name-keys-on-windows-7 | http://msdn.microsoft.com/en-us/library/bb909654(v=vs.90).aspx 確實幫助我解決了爲我工作的問題。 – 2014-04-09 21:28:02

回答

9

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

+0

我檢查了RSA和Crypto文件夾的權限,但不知何故它沒有設置爲機器密鑰。謝謝你。 – 2010-03-11 14:47:03

+0

這是因爲它是重要的MachineKeys文件夾,它不會繼承權限! – 2011-07-21 10:54:00

0

退房this blog post由Scott Hanselman的 - 這是一個小老頭,但MvcMockHelpers他顯示有可能會給予你如何完成你在做什麼是一個好主意。

-1

您應該觀看this video on asp.net網站,該網站展示了一個令人讚歎的實施示例。

+2

簽名是這裏的問題,而不是如何在mvc中模擬。 – Will 2010-03-11 14:33:31

+0

ok同意我的錯誤 – 2010-03-11 14:38:20