2010-03-11 4 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 (Boolean exported, Byte [] array, String container) 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 (Boolean signStrongName) Castle.DynamicProxy.ModuleScope.ObtainDynamicModuleWithStrongNam е() Castle.DynamicProxy.ModuleScope.ObtainDynamicModule (Boolean isStrongNamed) Castle.DynamicProxy.Generators.Emitters.ClassEmitter.CreateTypeBuilder (ModuleScope modulescope, имя String, тип (бла-бла-чик)

I гугле и предложения здесь не похожи на работу (установку изменение RSA безопасности папки и т.д.) http://groups.google.com.br/group/castle-project-users/browse_thread/thread/85685cf32a795158

Я правильно думать, что HttpContextBase является частью System.Web.Abstraction, которая является знаковой сборкой. Moq на самом деле попытается подписать динамическую сборку и потерпеть неудачу?

+0

FWIW, я использовал Moq издеваться HttpContextBase много раз и никогда не было этой проблемы.Какова бы ни была ваша проблема, она не является общей для комбинации Moq и HttpContextBase. –

+0

Фокус в том, что разрешения должны быть установлены в папке MachineKeys, а не RSA. Сообщение от Айенде не делает это совершенно очевидным, если вы не внимательны к читателю. –

+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 действительно помог мне разобраться в исправлении, которое сработало для меня. –

ответ

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, но почему-то не установлен для Machine Keys. Спасибо, будет. –

+0

Это потому, что это папка MachineKeys, и это не наследует разрешения! –

0

Заканчивать this blog post Скотт Hanselman - это немного старый, но MvcMockHelpers он показывает там, вероятно, даст вам хорошее представление о том, как добиться того, что вы делаете.

-1

Вы должны посмотреть сайт this video on asp.net, который показывает удивительный пример реализации.

+2

Подписание - это проблема здесь, а не как насмехаться в mvc. – Will

+0

ok согласен с моей ошибкой –

Смежные вопросы