使用NUnit测试控制器HTTP方法

3
我用C#编写了一个后端,使用简单的HTTP方法:Get、Post(创建)、Put(更新)和Delete。
现在我想用NUnit实现一些单元测试。我发现了这篇文章this article,其中介绍了NUnit的基础知识。但现在问题是,我该如何使用它来创建单元测试呢?
有人能解释一下我该怎么测试控制器的HTTP方法吗?
谢谢!:)
编辑:
为了更清晰地表达,我想测试是否可以通过我的控制器类获取、创建、更新和删除项目。

不做任何假设,回答这个问题是很困难的。你是否已经将Nunit框架“安装”到测试项目中?控制器内有什么样的代码?如果没有看到代码,就无法确定你想要如何测试以及测试什么内容。 - Fabio
你尝试了什么?有什么问题吗?也许你试图测试错误的东西?测试控制器非常容易。您无需设置整个 ASP.NET 堆栈。只需创建控制器的实例,将任何依赖项传递给构造函数,并使用实际参数调用操作方法即可。 - Panagiotis Kanavos
你想要测试什么?控制器不负责HTTP动词过滤或路由。Verendus发布的答案展示了测试这些方法有多容易。 - Panagiotis Kanavos
如果你需要一个强大的工具,但价格昂贵,你可以使用Isolator - Sam
2个回答

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://learn.microsoft.com/zh-cn/aspnet/mvc/overview/older-versions-1/unit-testing/creating-unit-tests-for-asp-net-mvc-applications-cs


OP想要使用NUnit,因此应该使用[TestFixture][Test] :) - Sam

1
个人而言,我倾向于避免在控制器本身中放置太多逻辑,因为它们不是那么容易测试(正如您现在所看到的)。
相反,添加一个服务层来执行任何所需的业务逻辑并测试该层。这样,该逻辑也可以在非MVC情况下重复使用。
这样,您的控制器操作可以被简化为以下内容:
//Controller action
IHttpResult DoSomething(string input)
{
    var model = SomeService.DoThings(input);
    return View("~/views/DoSomethingView.cshtml", model);
}

这个东西非常轻盈,以至于你可能晚上睡觉时不需要进行单元测试,但是SomeService可以很容易地完成单元测试。


除非您将一些与视图相关的逻辑放在视图中,否则请勿这样做。 - Fabio
谢谢您的建议,但由于某些要求,我无法创建服务层。 - user8289962
相反,可测试性是使用控制器的主要优势之一。您只需创建一个控制器实例并调用其方法,而无需设置整个ASP.NET堆栈。服务层用于将业务逻辑与请求处理分离。如果您在控制器内部硬编码服务或在服务内部硬编码数据库连接,则两者都无法进行测试。这既不是控制器的错,也不是服务的错。 - Panagiotis Kanavos
@PanagiotisKanavos - 这是回应我吗?我不想在控制器中硬编码对具体类的引用。SomeService将是某种接口,通过构造函数注入。我的观点很简单,即控制器不是放置需要大量测试的逻辑的地方,因为从响应中获取实际内容并不那么琐碎,因此将逻辑放在其他地方更容易...这也使其更具可重用性。 - GPW
@RaphaelMüller:你所需要创建的只是一个类,将逻辑放入其中并进行测试。如果你愿意,你可以把它看作是一个“层”,但它只是一个类而已。理想情况下,你还应该在接口后面进行抽象,并通过依赖注入在控制器中使用它。我很难想象有什么要求会如此严格? - GPW

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接