Указатели нужны при первом тестировании с NUnit и MVC Contrib - PullRequest
1 голос
/ 04 декабря 2010

Я использую ASP.NET MVC 2, NUnit, Moq и 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, я получаю сообщение об ошибке и не уверен, что это значит:

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

1 Ответ

3 голосов
/ 04 декабря 2010
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.

...