2010-12-04 32 views
1

我正在使用ASP.NET MVC 2,NUnit,Moq和MVC Contrib。我曾經寫過我的第一個單元測試,並且有幾個關於這個測試的問題。我的場景是我有一個索引視圖。在這個視圖中,我有一個顯示所有新聞項目的網格。指針需要在NUnit和MVC第一次測試Contrib

這裏是我INewsRepository類:

public interface INewsRepository 
{ 
    IEnumerable<News> FindAll(); 
} 

我的測試類與測試方法:

public class NewsControllerTest :TestControllerBuilder 
{ 
    private Mock<INewsRepository> mockNewsRepository; 
    private NewsController newsController; 

    [SetUp] 
    public void Init() 
    { 
     mockNewsRepository = new Mock<INewsRepository>(); 
     newsController = new NewsController(mockNewsRepository.Object); 
     InitializeController(newsController); 
    } 

    [Test] 
    public void NewsController_Index() 
    { 
     // Arrange 
     var news = new Mock<IEnumerable<News>>(); 
     mockNewsRepository.Setup(r => r.FindAll()).Returns(news.Object).Verifiable(); 

     // Act 
     ActionResult actual = newsController.Index(); 

     // Assert 
     mockNewsRepository.Verify(); 
     actual 
     .AssertViewRendered() 
     .ForView("Index") 
     .WithViewData<News[]>() 
     .ShouldBe(news); 
    } 
} 

我的觀點:

public ActionResult Index() 
{ 
    FakeNewsRepository fakeNewsRepository = new FakeNewsRepository(); 
    IEnumerable<News> news = fakeNewsRepository.FindAll(); 
    return View(news); 
} 

我需要在路上一些指針是我做的。我的方向是否正確?我應該補充什麼,我應該留下什麼?我想做單元測試,我將它與集成測試混合在一起嗎?任何額外的建議,將不勝感激。

當我運行這個測試在NUnit的GUI控制檯,然後我得到一個錯誤回來,I'mnot知道這意味着什麼:

MyProject.Web.Tests.Controllers.NewsControllerTest.NewsController_Index: 
Moq.MockVerificationException : The following setups were not matched: 
INewsRepository r => r.FindAll() 

回答

3
public ActionResult Index() 
{ 
    FakeNewsRepository fakeNewsRepository = new FakeNewsRepository(); 
    IEnumerable<News> news = fakeNewsRepository.FindAll(); 
    return View(news); 
} 

你不能嘲笑是硬編碼在這樣的庫你的行動。你在動作中實例化它,你將永遠無法單元測試這個並模擬庫。存儲庫需要作爲依賴注入。你可以使用一個接口,這個接口傳遞到你的控制器的構造函數:

public class HomeController: Controller 
{ 
    private readonly IRepository _repository; 
    public class HomeController(IRepository repository) 
    { 
     _repository = repository; 
    } 

    public ActionResult Index() 
    { 
     IEnumerable<News> news = _repository.FindAll(); 
     return View(news); 
    } 
} 

現在,在你的單元測試,你可以你的資料庫的嘲笑實例傳遞給控制器​​構造並確定預期。

另請注意,MVCContrib.TestHelper旨在與Rhino Mocks一起使用。我不太確定它是否可以與Moq正常工作。

+0

在你的代碼中,你有一個名爲_sut的控制器的變量名。你爲什麼這麼稱呼它? – 2010-12-04 13:19:12