2010-03-05 5 views
3

Moq을 사용하여 클래스를 모의하려고하면 메서드 특성이 모의 클래스에는 상속되지만 매개 변수 특성에는 상속되지 않습니다.Moq 및 매개 변수 특성 상속

기본적으로 "let a = (ArgumentsAttribute) p.GetCustomAttributes (typeof (ArgumentsAttribute), true) .SingleOrDefault()"속성을 반환하지 않습니다. 코드를 실행하여 실패한 곳을 확인합니다.

이 테스트를 통과하려면 어떻게해야합니까?

[TestFixture] 
public class MyTests { 
    [Test] 
    public void shouldFindAndCallMethodWithAttributes() { 
     var myInterface = new Mock<MyClass>(); 
     myInterface.Setup(x => x.MyMarkedMethod(1)); 
     myInterface.Setup(x => x.MyMarkedMethod(5)); 
     myInterface.Setup(x => x.MyMarkedMethod(9)); 

     var executor = new MarkedMethodExecutor(); 
     executor.FindAndCallMethodWithAttributes(myInterface.Object); 

     myInterface.VerifyAll(); 
    } 
} 

public class MarkedMethodExecutor { 
    public void FindAndCallMethodWithAttributes(object anObject) { 
     var methods = from m in anObject.GetType().GetMethods() 
         where m.GetCustomAttributes(typeof (ExecuteMeAttribute), true).SingleOrDefault() != null 
         select m; 
     foreach (var method in methods) { 
      var callInfos = from p in method.GetParameters() 
          let a = (ArgumentsAttribute) p.GetCustomAttributes(typeof (ArgumentsAttribute), true).SingleOrDefault() 
          where a != null 
          select new {Parameter = p, Attribute = a}; 
      // assume its one argument here for simplicity.. 
      var attribute = callInfos.Single().Attribute; 
      foreach (var argument in attribute.Arguments) { 
       method.Invoke(anObject, new[] {argument}); 
      } 
     } 
    } 
} 

public class MyClass { 
    [ExecuteMe] 
    public virtual void MyMarkedMethod([Arguments(1, 5, 9)] int arg) {} 
} 

[AttributeUsage(AttributeTargets.Method, AllowMultiple = false, Inherited = true)] 
public class ExecuteMeAttribute : Attribute {} 

[AttributeUsage(AttributeTargets.Parameter, AllowMultiple = false, Inherited = true)] 
public class ArgumentsAttribute : Attribute { 
    public readonly object[] Arguments; 

    public ArgumentsAttribute(params object[] arguments) { 
     Arguments = arguments; 
    } 
} 
+0

나는 이것을 위해 조롱/격리 프레임 워크를 사용하지 않을 것이다. 내 테스트 프로젝트 내에서 선언 된 실제 클래스에 대해 테스트 할 것이다. 표시된 메소드에서 특성을 설정하고 실행 프로그램을 호출 한 다음 특성이 설정되었는지 확인하십시오. – TrueWill

답변

0

나는 당신의 문제를 이해하지 않습니다 당신은 속성을 설정 하시겠습니까?

It.is (일치) 함수를 사용할 수 있습니다. 어쩌면 도움이 될 것입니다 : http://api.moq.me/html/5976987C.htm

+0

매개 변수에서 속성을 검색 할 수 있기를 원하지만 클래스가 mocked 될 때 (클래스가 상속 된 moq에 의해 프록시가 작성되는 경우) 속성은 사라지고 설정은 상속됩니다. 기본적으로 "let a = (ArgumentsAttribute) p.GetCustomAttributes (typeof (ArgumentsAttribute), true) .SingleOrDefault() "특성을 반환하지 않습니다 ... – MatteS

0

TypeDescriptor.AddAttributes 방법으로 작동합니까? 나는 궁금 할 것이다 :

var myInterface = new Mock<IRepository>(); 
var attribute = new ExecuteMeAttribute(); 
someInstanceTypeDescriptor.AddAttributes(myInterface.Object, attribute);