0

所以我试图测试这个方法将返回“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);
    }
4

1 回答 1

2

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

测试时,您要确保不属于被测系统 (SUT) 的所有位都是可操作的。这使您可以对所有其他位进行调整以生成场景。

如果用户是您想独立于控制器进行 tweek 处理的东西,您有两种选择:

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

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

于 2013-07-20T00:11:45.853 回答