【问题标题】:NUnit test of constructor fails because of missing parameter由于缺少参数,构造函数的 NUnit 测试失败
【发布时间】:2019-04-24 06:25:20
【问题描述】:

我正在尝试使用 NUnit 运行单元测试,因此遵循了一个教程,其中说明了以下内容:

[TestFixture]
public class TestFootballplayerController
{
    [Test]
    public void FootBallPlayer_CheckingIfControllerReturnsCorrectView_MustReturnTrue()
    {
        string expected = "CreatePlayer";
        FootballplayerController controller = new FootballPlayerController();

        var result = controller.CreateIngredient() as ViewResult;

        Assert.AreEqual(expected, result.ViewName);
    }
}

本教程假设我有一个空的默认构造函数,但我的构造函数包含一个带有我的 DBContext 的参数,如下所示:

    public class FootballplayerController : Controller
{
    private readonly FootballContext _context;

    public FootballplayerController(FootballContext context)
    {
        _context = context;
    }

    public IActionResult CreatePlayer()
    {
        return View();
    }
}

Visual Studio 建议我创建一个空的构造函数,但这样我想我只会测试一些不应该测试的东西,而不是带有参数的正确构造函数。

如果答案很明显,那么我必须说,我是单元测试的新手,无法解决这个问题。我必须伪造一个参数吗?

【问题讨论】:

  • 你需要注入上下文依赖
  • 如前所述,您需要向正在测试的控制器提供上下文(依赖关系)的实例。
  • 也就是说,控制器应该依赖于抽象而不是具体。否则,在这种情况下,您需要使用内存数据库运行集成测试以连接上下文。如果您想单独测试控制器,则将上下文抽象出来。
  • Nkosi 上面的 cmets 是这个问题的正确答案
  • @Nkosi 谢谢,但这是否意味着我必须在控制器上使用 NSubstitute?你给我的第二个答案我完全不明白,对不起。让我困惑的是,我只想检查控制器是否返回正确的视图,但感觉它需要的工作和知识比我这样的菜鸟想象的要多。

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


【解决方案1】:

在这种情况下,您可以使用例如 MoQ 框架来模拟这个类

[Test]
public void FootBallPlayer_CheckingIfControllerReturnsCorrectView_MustReturnTrue()
{
    string expected = "CreatePlayer";
    var mock = new Mock<FootballContext>();
    FootballplayerController controller = new FootballPlayerController(mock.Object);

    var result = controller.CreateIngredient() as ViewResult;

    Assert.AreEqual(expected, result.ViewName);
}

但你必须记住,现在在这个测试中只是一个空类。您可以通过模拟所有 DbSet 来创建更好的模拟,并将它们设为 IQueryable。

【讨论】:

  • 这很有意义,但它现在给了我以下错误“Castle.DynamicProxy.InvalidProxyConstructorArgumentsException:无法实例化类的代理:WABI.Models.WABIContext。找不到无参数的构造函数。”我猜它仍然在寻找那个无参数的构造函数?
  • 最终创建了空的默认构造函数,因为它不影响单元测试。这会生成正确的单元测试,但不是问题。
  • 你有 FootballContext 的无参数构造函数吗?我记得我对此和 Microsoft DI 有类似的问题。
  • 我最终创建了一个无参数构造函数,因为找到解决方法花费了太多时间,而且从上面的 cmets 看来,这似乎是一项超出我技能的任务。无参构造函数解决了这个问题。
猜你喜欢
  • 2011-11-14
  • 1970-01-01
  • 2013-11-30
  • 2016-06-24
  • 1970-01-01
  • 2015-06-16
  • 2011-12-29
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多