首页 > 解决方案 > 如何为继承另一个类的泛型类编写 nunit 测试用例(c#)

问题描述

我正在尝试为一个通用类编写 Nunit 测试用例,如下所示。但是我不知道我应该如何编写测试用例,因为像下面这样的编写甚至无法运行,有人可以帮忙吗?

我的主要课程是:-

public class TestController<T> : ControllerBase
{
    private const string STATUS_OK_MESSAGE = "OK";
     
    [HttpGet]
    public ContentResult Get()
    {
       *** Some logic here *****
      return Content(STATUS_OK_MESSAGE);
    }
}

我尝试过的测试用例如下所示:-

[TestFixture]
public class Test1<T> where T : class
{
   TestController testController;
   
   [OneTimeSetUp]
   public void OneTimeSetup()
   {
      testController= new TestController();
   }

   [Test]
   public void Get()
   {
        var result = (ContentResult)testController.Get();
        Assert.AreEqual("OK", "OK");
   }
} 

 

标签: c#.netunit-testingnunit

解决方案


您不会在任何地方告诉 NUnit 用于T. 该where子句适用于编译器,而不适用于 NUnit。因此,NUnit 无法构造您的夹具,因为它可能只为特定的T.

更根本的是,在您的测试代码中,您没有使用T. 如果控制器类是通用的,那么您将不得不在代码中使用 TestController。或者使用特定的 TestController 类型。

基本上,我们需要知道为什么您希望您的测试是通用的。或者你是否真的这样做。您的应用程序中是否有多个 TestController 类型?还是只有一个?如果只有一个,您根本不需要通用测试。

如果您编辑您的问题以解释更多您想要做的事情,我将在此处添加一些建议的代码。但是您可能会尝试做几件不同的事情,并且每件事情的代码都不同。

更新

根据您需要多个控制器的信息,编写测试的一种方法是......

[TestFixture(typeof(TestController<Class1>)]
[TestFixture(typeof(TestController<Class2>)]
public class Test1<T> where T : ControllerBase, new()
{
   T testController;
   
   [OneTimeSetUp]
   public void OneTimeSetup()
   {
      testController = new T();
   }

   [Test]
   public void Get()
   {
        var result = (ContentResult)testController.Get();
        Assert.AreEqual("OK", "OK");
   }
} 

仅当您的控制器都具有默认构造函数时,此方法才有效。


推荐阅读