【问题标题】:object reference not set to instance of an object issues in unit testing of asp.net mvc在 asp.net mvc 的单元测试中,对象引用未设置为对象问题的实例
【发布时间】:2020-05-16 00:25:13
【问题描述】:

我是为 asp.net 编写单元测试的初学者。我创建了一个简单的项目并尝试开始我的测试之旅。但是,我遇到了两个相同问题的错误:“object reference not set to instance of an object” 第一个位置在 home 控制器中,如下所示:

public class HomeController : Controller
{
    private readonly ILogger<HomeController> _logger;

    public HomeController(ILogger<HomeController> logger)
    {
        _logger = logger;
    } 

    [ResponseCache(Duration = 0, Location = ResponseCacheLocation.None, NoStore = true)]
    public IActionResult Error()
    {
        return View(new ErrorViewModel { RequestId = Activity.Current?.Id ?? HttpContext.TraceIdentifier });
    }

这是我的测试方法:

public class HomeControllerUnitTests
{
     ILogger<HomeController> _logger;

     [Fact]
     public void Error_ActionExecutes_ReturnsAViewResult()
     {
        // Arrange
        var homeController = new HomeController(_logger);

        // Act
        var result = homeController.Error() as ViewResult;

        // Assert
        Assert.Null(result.ViewData.Model);
     }
}

第二名在Movie Controller中:

public class MoviesController : Controller
{
        private readonly MvcMovieContext _context;

        public MoviesController(MvcMovieContext context)
        {
            _context = context;
        }

        // GET: Movies
        public async Task<IActionResult> Index()
        {
            return View(await _context.Movie.ToListAsync());
        }
}

我的测试方法如下:

public class MoviesControllerUnitTests
{
        private Mock<MvcMovieContext> _mock;

        [Fact]
        public async Task Index_ActionExecutes_ReturnsAViewResult()
        {
            // Arrange
            MoviesController controller = new MoviesController(_mock.Object);

            // Act
            var result = await controller.Index() as Task<ViewResult>;

            // Assert
            Assert.IsType<ViewResult>(result);
        }
    }

请帮助我并提前感谢。

【问题讨论】:

    标签: asp.net unit-testing model-view-controller


    【解决方案1】:

    Object reference not set to an instance of an object 行下方应该有一个关于错误发生的文件和行的指示,这有助于您确定哪些变量为空(但您也可以使用调试器)。

    对于MoviesControllerUnitTests,这可能是_mock 变量,因此请务必按照docs 所示对其进行初始化,例如:

    private Mock<MvcMovieContext> _mock = new Mock<MvcMovieContext>();
    

    对于HomeControllerUnitTests,您可能需要模拟Activity 或设置HttpContext(参见例如此question)。

    【讨论】:

      猜你喜欢
      • 2011-01-22
      • 2020-04-13
      • 2014-10-15
      • 2013-08-18
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-09-29
      相关资源
      最近更新 更多