ViewBag属性在单元测试中始终返回null

时间:2018-08-24 23:19:22

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

我正在尝试测试是否已从控制器填充ViewBag数据,但是在我的单元测试中,无论设置什么,我的属性都将返回null。

控制器:

    public ActionResult Index()
    {
        _logger.LogEvent(LogLevel.Trace, null, $"Landing page requested", null);
        ViewBag.InstrumentationKey = _instrumentationKey;
        return View("Index");
    }

单元测试:

    [TestMethod]
    public void TestIndexHasApplicationInsightsKey()
    {
        // Arrange            
        var mock = new Mock<ILogging>();
        mock.Setup(logging => logging.LogEvent(It.IsAny<LogLevel>(), It.IsAny<Exception>(), It.IsAny<string>(), It.IsAny<object[]>())).Verifiable();
        HomeController controller = new HomeController(mock.Object);

        // Act
        ViewResult result = controller.Index() as ViewResult;

        // Assert
        Assert.AreNotEqual(null, result.ViewBag.InstrumentationKey as string);
    }

结果:

  

Assert.AreNotEqual失败。预期的任何值,除了:<(null)>。实际:<(空)>。

我读了一些答案,说我应该访问属性视图ViewData [“ InstrumentationKey”],但它也总是返回null。

有什么主意我做错了,不允许我测试ViewBag属性值吗?

1 个答案:

答案 0 :(得分:1)

出于说明目的,对以下内容进行了测试

[TestClass]
public class MyViewBagTestClass {
    [TestMethod]
    public void TestIndexHasApplicationInsightsKey() {
        // Arrange            
        HomeController controller = new HomeController();

        // Act
        ViewResult result = controller.Index() as ViewResult;

        // Assert
        Assert.AreNotEqual(null,result.ViewBag.InstrumentationKey as string);
    }
}

public class HomeController : Controller {
    public ActionResult Index() {
        ViewBag.InstrumentationKey = "Hello world";
        return View("Index");
    }
}

证明它在测试时确实有效。它是做什么的,在测试时通过。

这会让我相信,在进行测试时,您所测试的方法中的_instrumentationKey实际上是 null

我建议您检查何时填充该变量,并确保在执行被测方法期间分配了一个值。