Moq + Castle Dynamic Proxy - исключение насмешливых вложенных универсальных интерфейсов - PullRequest
2 голосов
/ 10 августа 2011

Я получаю исключение аргумента от Castle Dynamic Proxy, когда использую Moq для создания макета объекта, который реализует вложенный универсальный интерфейс с универсальным методом, который имеет ограничение интерфейса.

Исключением является: System.ArgumentException: невозможно установить родительский интерфейс.

Происходит при доступе к свойству объекта макета непосредственно после создания макета. (Стек вызовов находится внизу для удобства чтения)

Код прост и самоописан:

    public interface A<T>
    {
        void Method<Z>() where Z : T; 
    }

    public interface B
    {
    }

    [Test]
    public void MockNestedGenericInterfaceTest()
    {
        Mock<A<B>> mock = new Mock<A<B>>();
        var o = mock.Object; //argument exception here
    }

Тест не генерирует исключение, если предложение Z: T удалено.

Я провел некоторое исследование и нашел билет здесь . Я использую последние версии Moq и Castle.

Есть ли решение этой проблемы? Единственный способ, которым я вижу, как это работает - это ручная реализация. Насмешки с носорогом у меня тоже не сработали.

Спасибо.

Стек вызовов:

at System.Reflection.Emit.TypeBuilder.SetParent(Type parent)

в Castle.DynamicProxy.Generators.Emitters.GenericUtil.CopyGenericArguments (MethodInfo methodToCopyGenericsFrom, Словарь 2 name2GenericType, ApplyGenArgs genericParameterGenerator) at Castle.DynamicProxy.Generators.Emitters.AbstractTypeEmitter.CopyGenericParametersFromMethod(MethodInfo methodToCopyGenericsFrom) at Castle.DynamicProxy.Generators.InvocationTypeGenerator.Generate(ClassEmitter class, ProxyGenerationOptions options, INamingScope namingScope) at Castle.DynamicProxy.Contributors.InterfaceProxyWithoutTargetContributor.GetInvocationType(MetaMethod method, ClassEmitter emitter, ProxyGenerationOptions options) at Castle.DynamicProxy.Contributors.InterfaceProxyWithoutTargetContributor.GetMethodGenerator(MetaMethod method, ClassEmitter class, ProxyGenerationOptions options, OverrideMethodDelegate overrideMethod) at Castle.DynamicProxy.Contributors.CompositeTypeContributor.ImplementMethod(MetaMethod method, ClassEmitter class, ProxyGenerationOptions options, OverrideMethodDelegate overrideMethod) at Castle.DynamicProxy.Contributors.CompositeTypeContributor.Generate(ClassEmitter class, ProxyGenerationOptions options) at Castle.DynamicProxy.Generators.InterfaceProxyWithoutTargetGenerator.GenerateType(String typeName, Type proxyTargetType, Type[] interfaces, INamingScope namingScope) at Castle.DynamicProxy.Generators.InterfaceProxyWithTargetGenerator.GenerateCode(Type proxyTargetType, Type[] interfaces, ProxyGenerationOptions options) at Castle.DynamicProxy.ProxyGenerator.CreateInterfaceProxyWithoutTarget(Type interfaceToProxy, Type[] additionalInterfacesToProxy, ProxyGenerationOptions options, IInterceptor[] interceptors) at Moq.Proxy.CastleProxyFactory.CreateProxy(ICallInterceptor interceptor, Type[] interfaces, Object[] arguments) at Moq.Mock 1.b__0 () в Moq.Mock 1.InitializeInstance() at Moq.Mock 1.OnGetObject () в Moq.Mock`1.get_Object ()

1 Ответ

3 голосов
/ 11 августа 2011

Эта ошибка была исправлена ​​в последней версии DynamicProxy. Убедитесь, что вы используете последнюю версию Moq

...