2011-08-10 4 views
2

성 동적 프록시에서 인수 예외가 발생했습니다. Moq를 사용하여 인터페이스 제약 조건이있는 일반 메소드로 중첩 된 일반 인터페이스를 구현하는 객체 조롱을 만들었습니다 .Moq + Castle 동적 프록시 - 중첩 된 일반 인터페이스를 조롱하는 예외적 인 경우

예외는 다음과 같습니다. System.ArgumentException : 상위 인터페이스를 설정할 수 없습니다.

모의 작성 직후 모의 객체 속성에 액세스하는 동안 발생합니다. T 절 제거된다 : Z는 어디 경우

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 
    } 

테스트 예외를 생성하지 않는다 :

코드가 단순하고 자기 설명 적이다 (호출 스택 가독성을 위해서 아래에있다).

나는 약간의 조사를했고 티켓을 발견했다 here. Moq와 Castle의 최신 버전을 사용하고 있습니다.

이 문제의 해결 방법이 있습니까? 내가 작동하는 유일한 방법은 수동 모의 구현이다. Rhino mock이 나에게도 효과가 없었습니다.

감사합니다.

호출 스택 : Castle.DynamicProxy.Generators.Emitters.GenericUtil.CopyGenericArguments에서

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

(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()이 버그는 DynamicProxy의 마지막 버전에서 수정되었습니다

답변

3

. 당신이

+1

감사 의견 MOQ의 최신 버전을 사용하고 있는지 확인하지만, 우리 Castle.Core.dll 버전 2.5.2 및 Moq.dll 버전 4.0.0 - 작동하지 않습니다. 나중에 이것을 증명할 테스트 프로젝트를 제공 할 것입니다. – Cortlendt

+0

확인. 나는 정말로 버그가 수정되었다는 것을 확신한다. 아마도 v2.5.2가 아니지만 트렁크 일 것이다. 어쨌든 - 실패한 테스트는 훌륭 할 것이다. –

+0

좋아요, 저는 테스트 프로젝트를 여기에서 주최했습니다 - [link] (http://ge.tt/8KfdBl6?c) 현재 프로젝트에서 우리는 얼마 동안 최신 성 소스를 컴파일 할 것입니다. 내가 도움이 될지 여부를 게시 할 것입니다. – Cortlendt