【问题标题】:ControllerContext.IsChildAction invocation failed with mock behavior Strict. All invocations must have a setupControllerContext.IsChildAction 调用失败,模拟行为严格。所有调用都必须有一个设置
【发布时间】:2010-07-09 09:07:15
【问题描述】:

我正在学习如何对 ASP.NET MVC 控制器操作进行单元测试。具体来说,我正在尝试模拟 ControllerContext,以便我可以测试访问 HttpContext.Current.User.Identity.Name 的操作。

我正在使用起订量。

在我打开 MockBehavior.Strict 之前,一切都很顺利。我知道如果代码未能调用我标记为可验证的东西,这将引发异常。显然,如果没有调用我不提供设置的“额外”方法(如 IsChildAction),它也会引发异常。

[TestMethod]

public void Index_Get_AccessesUserIdentityName()
    {

// Arrange

var mock = new Mock<ControllerContext>(MockBehavior.Strict);

mock.SetupGet(p => p.HttpContext.User.Identity.Name).Returns("treycarroll").Verifiable();
HomeController controller = new HomeController();
controller.ControllerContext = mock.Object;

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

// Assert
mock.Verify();
...
}

这是我正在测试的控制器操作:

public ActionResult Index()
    {
        ViewData["Message"] = "Welcome to ASP.NET MVC!"+User.Identity.Name;

        return View();
    }

返回View()时触发异常;语句被执行。错误消息告诉我,我需要一个设置方法来调用 IsChildAction,所以我将测试类更新为:

[TestMethod] 

    public void Index_Get_AccessesUserIdentityName() 
    { 

        // Arrange 

        var mock = new Mock<ControllerContext>(MockBehavior.Strict); 

        string expectedUserName = "treycarroll";

        mock.SetupGet(p => p.HttpContext.User.Identity.Name).Returns(expectedUserName).Verifiable();
        mock.SetupGet(m => m.IsChildAction).Returns(true).Verifiable();
        HomeController controller = new HomeController(); 
        controller.ControllerContext = mock.Object; 

        // Act 
        ViewResult result = controller.Index() as ViewResult;
        string actualUserName = controller.ControllerContext.HttpContext.User.Identity.Name;


        // Assert 
        mock.Verify();
        Assert.AreEqual(actualUserName, expectedUserName);
        Assert.IsNotNull(result);            
    } 

...

之后我收到一个类似的错误,即没有 ControllerContext.RouteData 的设置方法。通过消除过程,我最终可以为所有丢失的调用添加 Setup 方法,但这似乎不正确。也许我误解了 MockBehavior.Strict 的使用,但我认为您打开它是为了避免获取属性的默认值(例如我要检查的 User 对象的 null )。我在这里错过了什么?

【问题讨论】:

    标签: asp.net-mvc-2 mocking moq


    【解决方案1】:

    如果有任何与预期不同的地方,严格的模拟将立即失败。所以这意味着,如果任何未在期望中指定的方法调用都将失败。另一方面,非严格的模拟忽略,这样的调用

    【讨论】:

      猜你喜欢
      • 2016-11-29
      • 2012-08-12
      • 2022-10-01
      • 2018-11-18
      • 1970-01-01
      • 2015-11-30
      • 1970-01-01
      • 1970-01-01
      • 2016-11-06
      相关资源
      最近更新 更多