【问题标题】:Moq TestMethod C#ASP.NET MVC最小起订量测试方法 C#ASP.NET MVC
【发布时间】:2019-01-11 08:35:27
【问题描述】:

我研究用 moq 编写一个模块测试,这个简单的测试失败了

消息:测试方法 UnitTests.AdminTests.IndexContainPlayerList 抛出 异常:System.NullReferenceException:

[TestMethod]
    public void IndexContainPlayerList()
    {
        //Arrange
        Mock<IPlayerRepository> mock = new Mock<IPlayerRepository>();
        mock.Setup(m => m.Players).Returns(new List<Player>() {
            new Player () { Id = 1, Name = "Karye", Surname = "Irving", Team = new Team(){ Id = 1, Name = "Boston Celtics" }, TeamId = 1 },
            new Player () { Id = 1, Name = "Stephan", Surname = "Carry", Team = new Team(){ Id = 2, Name = "Golden State Warriors" }, TeamId = 2 }
        });

        AdminController target = new AdminController(mock.Object, null);

        //Action
        Player[] resultList = ((IEnumerable<Player>)target.Index().ViewData.Model).ToArray();

        //Assert
        Assert.AreEqual(resultList.Length, 2);
    }

我正在测试的方法

 public ViewResult Index()
    {
        ViewBag.ChoosingTeam = new SelectList(teamRepository.Teams, "Name ", "Name");
        return View(playerRepository.Players.ToList());
    }

为什么试运行失败,可能是我丢失了什么或不明白?

【问题讨论】:

  • 在异常堆栈跟踪中,它应该会提示您正在抛出 NRE 的哪一行。
  • ViewBag.ChoosingTeam = ....;但它需要实现吗?

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


【解决方案1】:

NullReferenceException 被抛出是因为您将null 传递给您的AdminController,我假设是为了您的ITeamsRepository

如您所见,您正在尝试访问teamRepository,因为它为空,所以正在抛出NullReferenceException

您还需要模拟该依赖项。
示例:

Mock<ITeamsRepository> teamsMock = new Mock<ITeamsRepository>();
AdminController target = new AdminController(mock.Object, teamsMock.Object);

【讨论】:

  • @Andrei 太好了,我还要质疑那个测试的意义,除了验证它使用你的IPlayerRepository 来获取玩家之外,它并没有真正测试任何东西。
  • 我检查,将模型 的 Index() 方法发送到 View,并检查那些 Player 是否发送到 View
猜你喜欢
  • 2017-01-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-05-10
相关资源
最近更新 更多