【问题标题】:ASP.NET MVC: testing a controller with XUnitASP.NET MVC:使用 XUnit 测试控制器
【发布时间】:2016-01-13 19:55:39
【问题描述】:

我正在尝试将单元测试与 XUnit 一起用于 ASP.NET v5 MVC v6 应用程序。我可以对有效的方法进行简单的单元测试。我想测试控制器。现在,我有一个带有返回 Home/Index 视图的 Index 操作的 HomeController。我想测试 Index 视图是否是返回的视图。

这是我当前的测试文件:

using Microsoft.AspNet.Mvc;
using Xunit;
using XUnitWithMvcSample.Controllers;

namespace XUnitWithMvcSample.Tests
{
    public class Tests
    {
        private HomeController _homeController;
        public Tests()
        {
            _homeController = new HomeController();
        }
        [Fact]
        public void IndexActionReturnsIndexView()
        {
            var result = _homeController.Index() as ViewResult;
            System.Console.WriteLine(result);
            Assert.Equal("Index", result.ViewName);
        }

    }
}

这是控制器/HomeController.cs:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Threading.Tasks;
using Microsoft.AspNet.Mvc;


namespace XUnitWithMvcSample.Controllers
{
    public class HomeController : Controller
    {
        public IActionResult Index()
        {
            return View();
        }
    }
}

当我运行测试时,它失败了,因为result.ViewName 为空。看起来result 只是一个空的ViewResult,与_homeController 无关。我需要做些什么才能让测试在 HomeController 中找到 Index 视图?

【问题讨论】:

    标签: asp.net unit-testing asp.net-core-mvc xunit


    【解决方案1】:

    听起来您正在尝试测试框架中的功能,而不是方法中的功能。方法中的所有内容都是这样的:

    return View();
    

    所以,从字面上看,只要返回一个非空的ViewResult,那么该方法就会执行预期的操作:

    // Arrange
    var controller = new HomeController();
    
    // Act
    var result = controller.Index() as ViewResult;
    
    // Assert
    Assert.IsNotNull(result);
    

    将该结果链接到视图是 ASP.NET MVC 框架的一部分,并且发生在该方法之外。这意味着它不是方法调用本身的一部分,而是发生在方法范围之外。这使它超出了测试的范围。

    您必须设置一种正在运行的 ASP.NET MVC 应用程序并测试该应用程序才能测试该功能,这更像是一个黑盒测试而不是单元测试。

    【讨论】:

      【解决方案2】:

      答案有点晚了,但如果你能像那样改变你的行动方法,你的测试就会奏效。

      using System;
      using System.Collections.Generic;
      using System.Linq;
      using System.Threading.Tasks;
      using Microsoft.AspNet.Mvc;
      
      
      namespace XUnitWithMvcSample.Controllers
      {
          public class HomeController : Controller
          {
              public IActionResult Index()
              {
                  return View("Index");
              }
          }
      }
      

      【讨论】:

        猜你喜欢
        • 2017-12-12
        • 1970-01-01
        • 2019-03-16
        • 2012-02-24
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2019-02-26
        相关资源
        最近更新 更多