невозможно заглушить класс с помощью атрибута NullableContextAttribute

#c# #rhino-mocks

#c# #rhino-издевается

Вопрос:

Я использую стороннюю библиотеку, в которой есть некоторые классы, которые я пытаюсь смоделировать, используя Rhino Mocks. Когда я пытаюсь создать заглушку для класса, я получаю следующую ошибку. Я не могу найти ссылку на то, что такое NullableContextAttribute , но я предполагаю, что это связано с указанием типа с нулевым значением в определении события / делегата где-нибудь. Я не могу понять, что такое IAttributeDissassembler .

Я прочитал несколько решений об использовании AttributesToAvoidReplicating , но я не уверен, какой класс ему присвоить. NullableContextAttribute это не класс, который может разрешать любое пространство имен, которое я могу найти.

Я делаю C #, .NET Framework 4.7.2. Я попытался изменить свой уровень языка C # на более высокий, но я думаю, что атрибут nullable reference относится к чему-то, что есть в c # 8, на который, я думаю, я не могу настроить таргетинг с помощью какой-либо .NET Framework? .

         var myStub = MockRepository.GenerateStub<SomeOtherClass>();


   Castle.DynamicProxy.ProxyGenerationException : There was an error trying to replicate non-inheritable attribute NullableContextAttribute using default attribute disassembler. Use custom implementation of IAttributeDisassembler (passed as 'AttributeDisassembler' property of ProxyGenerationOptions) to replicate this attribute.
   at Castle.DynamicProxy.DefaultAttributeDisassembler.Disassemble(Attribute attribute)
   at Castle.DynamicProxy.Generators.Emitters.AbstractTypeEmitter.DefineCustomAttribute(Attribute attribute, IAttributeDisassembler disassembler)
   at Castle.DynamicProxy.Generators.BaseProxyGenerator.ReplicateNonInheritableAttributes(Type targetType, ClassEmitter emitter)
   at Castle.DynamicProxy.Generators.ClassProxyGenerator.GenerateType(String newName, Type[] interfaces)
   at Castle.DynamicProxy.Generators.ClassProxyGenerator.GenerateCode(Type[] interfaces, ProxyGenerationOptions options)
   at Castle.DynamicProxy.DefaultProxyBuilder.CreateClassProxy(Type classToProxy, Type[] additionalInterfacesToProxy, ProxyGenerationOptions options)
   at Castle.DynamicProxy.ProxyGenerator.CreateClassProxyType(Type classToProxy, Type[] additionalInterfacesToProxy, ProxyGenerationOptions options)
   at Castle.DynamicProxy.ProxyGenerator.CreateClassProxy(Type classToProxy, Type[] additionalInterfacesToProxy, ProxyGenerationOptions options, Object[] constructorArguments, IInterceptor[] interceptors)
   at Rhino.Mocks.MockRepository.MockClass(CreateMockState mockStateFactory, Type type, Type[] extras, Object[] argumentsForConstructor)
   at Rhino.Mocks.MockRepository.Stub(Type type, Object[] argumentsForConstructor)
   at Rhino.Mocks.MockRepository.<>c__DisplayClass1`1.<GenerateStub>b__0(MockRepository repo)
   at Rhino.Mocks.MockRepository.CreateMockInReplay[T](Func`2 createMock)
   at 
  

Ответ №1:

Вот мой грязный обходной путь. Поскольку NullableContextAttribute это только для компилятора, вы не можете использовать его в исходном коде 1. Но вы можете найти этот тип в сборке-макете, подобной этой Array.Find(typeof(SomeOtherClass).Assembly.GetTypes(), t => t.Name == "NullableContextAttribute") , где SomeOtherClass — это то, что вы пытаетесь высмеять. Найден Type объект, к которому вы можете перейти Castle.DynamicProxy.Generators.AttributesToAvoidReplicating.Add .

Повторяю, это, вероятно, худшее решение, но оно сработало для меня.

Ответ №2:

Изменение GenerateStub на GenerateStrictMockWithRemoting сработало для меня в аналогичной ситуации. Вы можете попробовать:

 var myStub = MockRepository.GenerateStrictMockWithRemoting<SomeOtherClass>();
  

Хотя у меня нет объяснения, почему это работает.