如何获得控制器的POST操作方法?

时间:2013-01-15 17:58:32

标签: c# .net asp.net-mvc unit-testing reflection

我需要对我的POST动作方法进行单元测试,所以我需要一个列表。我使用反射来查找[AcceptVerbs(HttpVerbs.Post)]的方法。

// get controller's methods
typeof(FooController).GetMethods()

// get controller's action methods
.Where(q => q.IsPublic && q.IsVirtual && q.ReturnType == typeof(ActionResult))

// get actions decorated with AcceptVerbsAttribute
.Where(q => q.CustomAttributes
  .Any(w => (w.AttributeType == _typeof(AcceptVerbsAttribute)))
  )

// ...everything is ok till here...

// filter for those with the HttpVerbs.Post ctor arg
.Where(q => q.CustomAttributes
  .Any(w => w.ConstructorArguments.Any(e => e.Value.Equals(HttpVerbs.Post))))
;

然而,这给了我一个空列表。问题出在最后一次检查属性的ctor。我该如何解决?

值得注意的是,有两种方法可以将操作方法​​声明为POST:使用上面的AcceptVerbsAttributeHttpPostAttribute

2 个答案:

答案 0 :(得分:2)

更改以下内容:

w => w.ConstructorArguments.Any(e => e.Value.Equals(HttpVerbs.Post))

w => w.ConstructorArguments.Any(e => ((HttpVerbs) e.Value) == HttpVerbs.Post)

这应该有用。

答案 1 :(得分:1)

您也可以使用[HttpPost]属性而不是[AcceptVerbs(HttpVerbs.Post)]来简化表达式。

http://msdn.microsoft.com/en-us/library/system.web.mvc.httppostattribute(v=vs.108).aspx