Note that there are some explanatory texts on larger screens.

plurals
  1. POMoq and parameter attribute inheritance
    primarykey
    data
    text
    <p>When I try to mock a class using Moq the method attribute gets inherited to the mock class, but not the parameter attribute.</p> <p>Basically the row "let a = (ArgumentsAttribute) p.GetCustomAttributes(typeof (ArgumentsAttribute), true).SingleOrDefault()" doesnt return the attribute.. Run the code to see where it fails.</p> <p>How do I make this test pass?</p> <pre><code>[TestFixture] public class MyTests { [Test] public void shouldFindAndCallMethodWithAttributes() { var myInterface = new Mock&lt;MyClass&gt;(); myInterface.Setup(x =&gt; x.MyMarkedMethod(1)); myInterface.Setup(x =&gt; x.MyMarkedMethod(5)); myInterface.Setup(x =&gt; 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; } } </code></pre>
    singulars
    1. This table or related slice is empty.
    1. This table or related slice is empty.
    plurals
    1. This table or related slice is empty.
    1. This table or related slice is empty.
    1. This table or related slice is empty.
 

Querying!

 
Guidance

SQuiL has stopped working due to an internal error.

If you are curious you may find further information in the browser console, which is accessible through the devtools (F12).

Reload