【问题标题】:Need to test controller HTTP methods with NUnit需要用 NUnit 测试控制器 HTTP 方法
【发布时间】:2017-11-06 11:34:05
【问题描述】:

我用简单的 HTTP 方法用 C# 编写了一个后端。获取、发布(创建)、放置(更新)、删除。

现在我想用 NUnit 实现一些单元测试。我发现 this article 描述了 NUnit 的基础知识。但现在的问题是,如何使用它来创建单元测试?

谁能解释我必须做些什么来测试控制器的 HTTP 方法?

提前致谢:)

编辑:

为了清楚起见,我想测试是否可以通过我的控制器类获取、创建、更新、删除项目。

【问题讨论】:

  • 不做假设就很难回答这个问题。您是否将 Nunit 框架“安装”到测试项目中,控制器内部有哪些类型的代码?如果没有看到代码,就不可能说出您想要测试的方式和内容。
  • 你尝试了什么,有什么问题?您是否正在尝试测试 wrong 的东西?测试控制器非常容易。您不需要设置整个 ASP.NET 堆栈。只需创建控制器的实例,在构造函数中传递任何依赖项并使用实际参数调用操作方法
  • 你要测试什么Controller 不负责 HTTP 动词过滤或路由。 Verendus 发布的答案显示了测试方法是多么容易
  • 如果您需要一个功能强大但价格昂贵的工具,您可以使用Isolator

标签: c# unit-testing nunit


【解决方案1】:

假设您使用的是 ASP.NET MVC,您可以执行以下操作:

 public class ProductController : Controller
 {
      public ActionResult Index()
      {
           // Add action logic here
           throw new NotImplementedException();
      }

      public ActionResult Details(int Id)
      {

           return View("Details");
      }
 }


 [TestFixture]
 public class ProductControllerTest
 {
      [Test]
      public void TestDetailsView()
      {
           var controller = new ProductController();
           var result = controller.Details(2) as ViewResult;
           Assert.AreEqual("Details", result.ViewName);

      }
 }

示例取自https://docs.microsoft.com/en-us/aspnet/mvc/overview/older-versions-1/unit-testing/creating-unit-tests-for-asp-net-mvc-applications-cs

【讨论】:

  • OP 想要使用 NUnit,所以它应该是 [TestFixture][Test] :)
【解决方案2】:

就我个人而言,我倾向于避免在控制器本身中添加太多逻辑,因为它们测试起来并不简单(正如您现在所见)。

相反,添加一个服务层来执行任何所需的业务逻辑并对其进行测试。这样逻辑也可以在非 MVC 情况下重用。

这样,您的控制器操作可以简化为:

//Controller action
IHttpResult DoSomething(string input)
{
    var model = SomeService.DoThings(input);
    return View("~/views/DoSomethingView.cshtml", model);
}

它是如此轻巧,以至于您可能无需真正进行单元测试就可以在晚上睡觉,但是 SomeService 可以轻松地进行完全单元测试。

【讨论】:

  • 除非你在视图中放一些视图相关的逻辑
  • 感谢您的建议,但实际上有些需求,我无法创建服务层。
  • 相反,可测试性是使用控制器的主要优势之一。无需设置整个 ASP.NET 堆栈,您只需创建一个 Controller 实例并调用其方法。服务层用于将业务逻辑与请求处理分开。如果您在控制器内硬编码服务,或在服务内硬编码数据库连接,您也无法测试。这既不是控制器的错,也不是服务的错
  • @PanagiotisKanavos - 这是对我的回应吗?我不想硬编码对控制器中具体类的引用。 SomeService 可能是通过构造函数注入注入的某种接口。我的观点很简单,控制器不是(IMO)放置需要大量测试的逻辑的地方,因为从响应中获取实际内容并不是那么简单,因此将逻辑简单地放在其他地方要容易得多..也使它更易于重复使用。
  • @RaphaelMüller:您只需要创建一个类来放入逻辑并对其进行测试。如果你愿意,你可以把它想象成一个“层”,但它只是一个类。理想情况下,您还可以在接口后面抽象它并通过依赖注入在控制器中使用它。我很难看出什么样的要求会受到限制?
猜你喜欢
  • 1970-01-01
  • 2021-08-16
  • 2011-05-10
  • 2017-07-23
  • 1970-01-01
  • 1970-01-01
  • 2013-10-14
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多