#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>();
Хотя у меня нет объяснения, почему это работает.