2013-03-06 75 views
1

我有一個MVC3項目,使用屬性注入。在我的控制器中,我打電話給一個服務類。正如我所提到的,它使用屬性注入(與團結),而不是通過構造函數解決這個問題。我搜索了所有試圖找到一個單元測試的例子,它解決了我的控制器中的這些依賴關係,但一切似乎都是指構造器DI。我感到沮喪。任何幫助都會很棒。控制器的帶性能注入的MVC3單元測試控制器

例子:

[Dependency] 
    public ITrainingService trainingService { get; set; } 

    public ActionResult Index(MyTrainingView myTrainingView) 
    { 
    //Load all training items into view object 
    myTrainingView.training = trainingService.getTraining(myTrainingView.trainingId); 
    myTrainingView.videos = trainingService.getTrainingVideos(myTrainingView.trainingId); 
    myTrainingView.visuals = trainingService.getTrainingVisuals(myTrainingView.trainingId); 
    myTrainingView.exams = trainingService.getTrainingExams(myTrainingView.trainingId); 

    return View(myTrainingView); 
    } 

我試圖運行我的單元測試時,以解決trainingService。我已經發現了無數的例子來模擬和解決使用構造函數依賴關係的依賴關係,但是在涉及屬性注入方面沒有任何例子。

+0

這個問題應該比較清楚。我知道你做了什麼,但不知道你想做什麼。什麼是沮喪的確切點。 – 2013-03-06 16:52:58

+0

發佈一些代碼會很有幫助,即使它不完整。向我們展示您想要設置的內容以及缺失的步驟。 – 2013-03-06 16:54:37

+0

我想解決我的控制器中的服務類(這是一個接口)上的空指針。我使用屬性注入來設置它,並且找不到可以實現這一點的單元測試的示例。 – Aaron 2013-03-06 16:55:44

回答

1

你不需要在你的單元測試中依靠統一。

像這樣的事情會做的伎倆:

[Test] 
    public void GetTrainingById() 
    { 
     var mockService = MockRepository.GenerateMock<ITrainingService>(); 
     mockService.Stub(service => service.getTraining(123)).Return(new ImaginaryClass()); 

     var sut = new TrainingController(); 
     sut.trainingService = mockService; 

     var myTrainingView = new MyTrainingView(); 
     sut.Index(myTrainingView); 

     Assert.AreEqual(expected, myTrainingView.training); 
    } 

如果在單元測試中,你必須使用統一,你可以只實例化在測試中UnityContainer,並使用RegisterInstance註冊您想要的對象注入。

+0

感謝Bas,我很感激。你的帖子填補了我缺少的空白。我使用這兩個示例都可以工作。 – Aaron 2013-03-06 20:10:58

+0

@Aaron沒有問題很高興我可以幫助一下。 PS很好的問題; upvoted! – bas 2013-03-06 20:13:59