2013-05-08 59 views
2

我對單元測試和ASP.NET MVC作爲一個整體相對比較陌生,我正在嘗試針對一個簡單的控制器操作和存儲庫編寫我的第一個單元測試(如下所示)使用Moq使用Moq通過存儲庫返回一個集合

ISubmissionRepository.cs

public interface ISubmissionRepository 
{ 
    IList<Submission> GetRecent(int limit = 10); 
} 

HomeController.cs:

/* Injected using Unit DIC */ 
public HomeController(ISubmissionRepository submissionRepository) 
{ 
    _submissionRepo = submissionRepository; 
} 

public ActionResult Index() 
{ 

    var latestList = _submissionRepo.GetRecent(); 
    var viewModel = new IndexViewModel { 
     NumberOfSubmissions = latestList.Count(), 
     LatestSubmissions = latestList 
    }; 
    return View(viewModel); 
} 

下面是單元測試我寫,但我嘲笑庫調用不顯得返回任何東西,我不知道爲什麼。我是否正確地嘲笑我的存儲庫調用?

HomeControllerTest.cs

[Test] 
public void Index() 
{ 
    IList<Submission> submissions = new List<Submission> 
    { 
     new Submission {Credit = "John Doe", Description = "Hello world", ID = 1, Title = "Example Post"}, 
     new Submission {Credit = "John Doe", Description = "Hello world", ID = 2, Title = "Example Post"} 
    }; 

    Mock<ISubmissionRepository> mockRepo = new Mock<ISubmissionRepository>(); 
    mockRepo.Setup(x => x.GetRecent(2)).Returns(submissions); 

    /* 
    * This appears to return null when a breakpoint is set 
    var obj = mockRepo.Object; 
    IList<Submission> temp = obj.GetRecent(2); 
    */ 

    controller = new HomeController(mockRepo.Object); 
    ViewResult result = controller.Index() as ViewResult; 

    Assert.NotNull(result); 
    Assert.IsInstanceOf<IndexViewModel>(result); 

} 

回答

1

的井控制器你打電話:

var latestList = _submissionRepo.GetRecent(); 

你的模擬是設置爲GetRecent(2)

修改您的模擬設置到:

mockRepo.Setup(x => x.GetRecent()).Returns(submissions); 

編輯

而且你的斷言應該是:

Assert.IsInstanceOf<IndexViewModel>(result.Model); 
+1

'result.Model'似乎完美地完成了這項工作!謝謝。 – 2013-05-13 22:31:23

2

此行

mockRepo.Setup(x => x.GetRecent(2)).Returns(submissions); 

告訴MOQ返回集合時,它被稱爲與參數2。您的控制器調用它作爲

var latestList = _submissionRepo.GetRecent(); 

這些是在Moq獨立設置,所以你的結果是沒有返回。你可以在測試中刪除2或讓你的控制器用2來調用它來獲得回報。

編輯 - 更新答案

嘗試設置你的實物模型爲:

mockRepo.Setup(x => x.GetRecent(It.Is<int>(i => i == 2))).Returns(submissions); 

,告訴它只有返回時,看到的2參數列表。您的管理員還需要用2來致電,才能返回工作。

否則,將其設置爲這是不可知的參數

mockRepo.Setup(x => x.GetRecent(It.IsAny<int>())).Returns(submissions); 
+0

我試圖從參數刪除到2的任何引用並且調用仍然顯示爲返回null而不是集合? – 2013-05-09 22:20:55

+0

您可能已經這樣做了,但嘗試使用It.IsAny ()作爲匹配條件以查看是否正在調用GetRecent()。如果它被調用,那麼它可能匹配GetRecent(10) - 默認參數。 – AlanT 2013-05-10 09:28:44

+0

@AlanT是的,我試過這個,但無濟於事。這個問題真的讓我難堪。 – 2013-05-13 07:52:36