2013-07-19 93 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