【发布时间】:2012-09-21 10:57:28
【问题描述】:
阅读帖子“How to check if method has an attribute”后,我一步一步解决了让我保持清醒的问题。
我现在的情况:
(我正在使用 ASP.Net MVC 4)
这些接口:
public interface IFlyable
{
ActionResult Fly();
}
public interface IRunnable
{
ActionResult Run();
}
这个抽象类:
public abstract class SuperHero : Controller
{
public void SavePeople()
{
}
}
这个控制器:
public class SuperManController : SuperHero,IFlyable,IRunnable {
[Authorize]
public ActionResult Fly(){
// Flying...
}
[Authorize]
public ActionResult Run(){
// Running...
}
}
这个抽象类(用于测试)
[TestClass]
public abstract class SuperHeroTest<TSuperHero>{
protected abstract TSuperHero GetSuperHero();
[TestMethod]
public void IfSuperHeroCanFlyMustHaveAuthorizeAttribute(){
var superHero=GetSuperHero();
if(superHero is IFlyable)
{
var superHeroFlyable = (IFlyable) superHero;
var have = MethodHasAuthorizeAttribute(() => superHeroFlyable.Fly());
Assert.IsTrue(have);
}
}
}
最后这个类继承自SuperHeroTest来测试SuperManController:
[TestClass]
public class SuperManControllerTest : SuperHeroTest<SuperManController>{
private SuperManController _superManController;
public SuperManControllerTest(){
_superManController=new SuperManController();
}
protected override SuperManController GetSuperHero()
{
return _superManController;
}
}
方法MethodHasAuthorizeAttribute是:(来自上面的帖子)
public static MethodInfo MethodOf(Expression<System.Action> expression)
{
MethodCallExpression body = (MethodCallExpression)expression.Body;
return body.Method;
}
public static bool MethodHasAuthorizeAttribute( Expression<System.Action> expression )
{
var method = MethodOf( expression );
const bool includeInherited = false;
return method.GetCustomAttributes(typeof(AuthorizeAttribute),includeInherited).Any();
}
我的问题是:
SuperHeroTest 类中的调用 MethodHasAuthorizeAttribute(() => superHeroFlyable.Fly()) 在应该返回 true 时返回 false。
(类SuperManController中实现的方法Fly具有Authorize属性)。
我将方法Fly中的属性Authorize添加到IFlyable中,然后返回true。
public interface IFlyable
{
[Authorize]
ActionResult Fly();
}
如何让MethodHasAuthorizeAttribute 检查实现而不是接口?
【问题讨论】:
-
感谢 Dove 的编辑!
标签: c# asp.net-mvc unit-testing reflection custom-attributes