2013-07-19 59 views
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,它是应用程序控制器中的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); 
    } 

回答

2

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

当您测试时,要确保所有不属于被测系统(SUT)的部分都是可操作的。这可以让你咀嚼所有其他位来产生场景。

如果用户想从控制器独立tweek东西,你有两个选择:

  • 让你想tweek外部访问(在这种情况下,让用户公开)
  • 解耦用户对象从实际的实施中,并在施工时通过IUserService或类似的课程。

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

+0

嗯所以有没有办法让模拟控制器,同时指定它应该实现的模拟接口? – 1Canuck16

+1

@mapleafman我不认为moq支持那样的东西。你可以模拟整个界面或整个实例(不要将它们连接在一起)。我想我的观点是,如果你觉得你在测试中需要做一些疯狂的事情来产生一个场景,它通常会产生一种代码异味,暗示你可能没有以正确的方式破坏实际的SUT –

+0

谢谢我感谢,我同意,只是与其他人一起工作,这主要是他们的设计,只是试图看看是否有什么可以做的,谢谢 – 1Canuck16