我使用的是一个第三方库,其中有一些我试图用Rhino mock模拟的类。当我尝试为一个类创建存根时,我得到了以下错误。我找不到NullableContextAttribute是什么的引用,但我认为它与在某个地方的事件/委托定义上指定可空类型有关。我搞不懂IAttributeDissassembler是什么。
我读过一些关于使用AttributesToAvoidReplicating
的解决方案,但我不确定应该给它提供什么类。NullableContextAttribute
不是一个可以解析到我能找到的任何名称空间的类。
我正在做C#,.NET框架4.7.2。我尝试将我的C#语言级别更高一些,但我认为c# 8中的可空引用属性是任何.NET框架都不能针对的。
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
发布于 2020-09-30 16:20:46
这是我的解决方法。由于NullableContextAttribute
仅用于编译器,因此您不能在源代码1中使用它。但是你可以在模拟程序集中找到这种类型,比如这个Array.Find(typeof(SomeOtherClass).Assembly.GetTypes(), t => t.Name == "NullableContextAttribute")
,其中SomeOtherClass就是你试图模拟的东西。找到可以传递给Castle.DynamicProxy.Generators.AttributesToAvoidReplicating.Add
的Type
对象。
我重复一遍,这可能是最糟糕的解决方案,但它对我很有效。
发布于 2021-08-27 16:17:43
在类似的情况下,将GenerateStub
更改为GenerateStrictMockWithRemoting
也适用于我。您可以尝试:
var myStub = MockRepository.GenerateStrictMockWithRemoting<SomeOtherClass>();
不过,我不知道为什么它会起作用。
https://stackoverflow.com/questions/64011323
复制相似问题