【问题标题】:Should I test for attributes in an ASP MVC project?我应该测试 ASP MVC 项目中的属性吗?
【发布时间】:2014-11-23 22:55:30
【问题描述】:

我有一个非常常见的场景,它涉及两个同名的操作方法 - 一个用于处理 POST 请求,另一个用于处理 GET 请求:

public ActionResult Add()
{
    return View();
}

[HttpPost]
public ActionResult Add(Question question)
{
    repository.Add(question);
    return RedirectToAction("Index");
}

如您所见,动作方法通过属性来区分。如果我删除 HttpPost 属性,运行时将崩溃并出现黄屏死机。

我的问题是:编写一个使用反射来验证这个特定方法是否用HttpPost 属性修饰的单元测试是否明智?我倾向于这样做,因为如果有人不小心删除了该属性,服务器就会崩溃。

【问题讨论】:

  • 添加单元测试不会对您造成任何伤害,但如果您认为有人可能会删除 HttpPost 属性,您可能应该与他们谈谈。
  • @Jonesy 好吧,我单独编码,但你的评论确实引起了我的共鸣。
  • 如果您为所有可能出错的事情添加测试,您将花费大量时间编写测试......如果您对此感到满意,那么无论如何...... . 但是,您通常必须自己决定测试的最佳价值所在。

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


【解决方案1】:

您的 post 方法在 C# 中已经具有不同的签名,因此您至少正在测试它是否存在。我认为这是由测试人员自行决定的,但不是绝对必要的。 GETPOST 请求是 Web 固有的。

如果你决定这样做,你可以做类似的事情

var postMethod = typeof(NameOfController).GetMethods().FirstOrDefault(p => p.GetCustomAttribute<HttpPost>(false) != null && p.Name == "Add");
Assert.IsTrue(postMethod != null);

它可能无法逐字编译,但这就是它的要点。确保添加 System.Reflection 以使扩展方法正常工作。

【讨论】:

    猜你喜欢
    • 2017-07-26
    • 2012-04-29
    • 1970-01-01
    • 1970-01-01
    • 2010-09-27
    • 2014-09-27
    • 2019-10-18
    • 1970-01-01
    相关资源
    最近更新 更多