如何模拟实现接口的控制器

时间:2013-07-19 23:10:47

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

所以我试图测试这个方法将返回“ManagerEventsIndex”的情况:

    public ActionResult Index()
    {
        if (this.CurrentUser != null)
        {
            if (this.CurrentUser.Role.Name == AvailableRoles.GameManager)
            {
                var model = new GameManagerEventsIndexModel();
                model.NumLocationsOfCurrentUser = this._customerLocationDataProvider.GetAllForUserId(CurrentUser.Id)
                                                                                    .Where(x => x.Active == true)
                                                                                    .Count();
                return View("ManagerEventsIndex", model);
            }
            else
            {
                return View();
            }
        }
        else
            return View("PublicIndex");
    }

但是这个控制器实现了另一个控制器ApplicationController,如下所示:EventsController:ApplicationController,它是我需要模拟的Application控制器中的CurrentUser对象,以便测试这个...这是我到目前为止的测试方法。感谢。

    [TestMethod]
    public void AssertGameManagerRoleReturnsGameManagerIndex()
    {
        // Arrange
        //eventsController = new EventsController(eventDataProvider.Object, playerEventDataProvider.Object, userDataProvider.Object,
                                                tokenAuthent.Object, dataContext.Object, customerLocationDataProvider.Object);

        var user = new Mock<User>();
        var role = new Mock<Role>();
        role.SetupSet(x => x.Name = "Ted");
        user.SetupSet(x => x.Role = role.Object);

        //?? var appController = new Mock<ApplicationController>();
        //?? appController.SetupSet(x => x.User = user);

        // var mController = new Mock<EventsController>();

        // Act
        var result = (ViewResult) eventsController.Index();

        // Assert
        Assert.AreEqual("ManagerEventsIndex", result.ViewName);
    }

1 个答案:

答案 0 :(得分:2)

我认为你的问题是你的控制器类实例中内置了太多功能,这使得测试更加困难。

测试时,您要确保所有不属于被测系统(SUT)的位都可以操作。这允许您调整所有其他位以产生场景。

如果用户想要独立于控制器进行调整,您有两种选择:

  • 使您想要外部访问的对象可访问(在这种情况下使用户公开)
  • 将您的用户与实际实现分离,并在构建时将IUserService或类似内容传递给类。

这些将使您能够在测试中使用对象。通常当你遇到这样的问题时,事情有点难以测试它是一个很好的指标,你没有正确地模块化你。