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