2012-09-30 17 views
8

Sau khi đọc bài "How to check if method has an attribute" Tôi là một bước để giải quyết vấn đề khiến tôi tỉnh táo.Cách kiểm tra xem phương thức có thuộc tính hay không (với giao diện, truyền và trừu tượng)

tôi trình bày tình hình:

(Tôi đang làm việc với ASP.Net MVC 4)

Những giao diện:

public interface IFlyable 
{ 
    ActionResult Fly(); 
}  

public interface IRunnable 
{ 
    ActionResult Run(); 
} 

này lớp trừu tượng:

public abstract class SuperHero : Controller 
{ 
    public void SavePeople() 
    { 
    }  
} 

điều khiển này:

public class SuperManController : SuperHero,IFlyable,IRunnable { 

    [Authorize] 
    public ActionResult Fly(){ 
     // Flying... 
    }  

    [Authorize] 
    public ActionResult Run(){ 
     // Running... 
    }  

} 

này lớp trừu tượng (đối với các bài kiểm tra)

[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); 
     } 

    } 
} 

Và cuối cùng lớp này thừa hưởng từ SuperHeroTest để kiểm tra SuperManController:

[TestClass] 
public class SuperManControllerTest : SuperHeroTest<SuperManController>{ 

    private SuperManController _superManController; 

    public SuperManControllerTest(){ 
     _superManController=new SuperManController(); 
    } 


    protected override SuperManController GetSuperHero() 
    { 
     return _superManController; 
    } 

} 

Phương pháp MethodHasAuthorizeAttribute là: (từ bài viết ở trên)

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(); 
} 

Vấn đề của tôi là:

Cuộc gọi MethodHasAuthorizeAttribute(() => superHeroFlyable.Fly()) trong SuperHeroTest khứ hồi hạng false khi nó phải trả lại true.

(Phương pháp được triển khai Fly trong lớp SuperManController có thuộc tính Authorize).

Tôi đã thêm thuộc tính Authorize vào phương pháp Fly vào IFlyable và sau đó trả về true.

public interface IFlyable 
{ 
    [Authorize] 
    ActionResult Fly(); 
} 

Làm cách nào tôi có thể làm để thực hiện MethodHasAuthorizeAttribute kiểm tra việc triển khai thay vì giao diện?

+0

Cảm ơn Dove để chỉnh sửa! –

Trả lời

9

Với một số sửa đổi đối với phương pháp IfSuperHeroCanFlyMustHaveAuthorizeAttribute(), bạn có thể làm cho nó hoạt động.

Kiểm tra đầu tiên nếu bộ điều khiển của bạn triển khai giao diện IFlyable. Nếu vậy, hãy lấy MethodInfo cho phương thức Fly của controller. Sau đó, bạn chỉ cần kiểm tra các thuộc tính cho MethodInfo đã trả về. Bằng cách này, bạn đang kiểm tra xem việc triển khai có thuộc tính thay vì giao diện hay không.

Các công trình sau đây OK:

[TestClass] 
public abstract class SuperHeroTest<TSuperHero> 
{ 
    protected abstract TSuperHero GetSuperHero(); 

    [TestMethod] 
    public void IfSuperHeroCanFlyMustHaveAuthorizeAttribute() 
    { 
     var superHero = GetSuperHero(); 

     if (superHero is IFlyable) 
     { 
      var superHeroFlyable = superHero; 
      var method = typeof (TSuperHero).GetMethod("Fly"); 
      var hasAttribute = 
       method.GetCustomAttributes(typeof (AuthorizeAttribute), false).Any(); 
      Assert.IsTrue(hasAttribute); 
     } 
    } 

    public static MethodInfo MethodOf(Expression<System.Action> expression) 
    { 
     var 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(); 
    } 
} 
+0

Nó hoạt động hoàn hảo! Christophe cảm ơn rất nhiều! –

+0

Kiểm tra vượt qua nếu superHero không được IFlyable xác nhận phải ở bên ngoài khối if – Grokodile