2010-12-04 29 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