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?
Cảm ơn Dove để chỉnh sửa! –