ASP.NET MVC 2: что тестировать в представлениях и контроллерах - PullRequest
0 голосов
/ 05 декабря 2010

Я использую MVC 2 с MVC contrib и Rhino mocks.

Мне нужна помощь. Это были тяжелые выходные. Я пытался найти хорошие статьи о том, как проводить тестирование на контроллерах с использованием MVC contrib. И ни у кого нет приличных ответов для меня. Я хочу знать, что мне нужно проверить на виде и в контроллерах? Это модульное или интеграционное тестирование?

Позвольте мне описать мой основной сценарий: у меня есть индексное представление с сеткой. В этой сетке у меня есть список новостей. В этой сетке в последнем столбце каждой строки есть ссылка «Редактировать», которая переводит пользователя в представление EditNews для редактирования выбранного элемента новостей. Также в этом представлении индекса есть кнопка «Добавить новости», которая переводит пользователя в представление CreateNews.

Теперь, учитывая текущий сценарий, какие тесты мне нужно написать? Не могли бы вы, ребята, также указать, являются ли они модульными или интеграционными тестами. Нужно ли писать тест для ссылки «Изменить»? Нужно ли писать тест для кнопки «Добавить новость»? Нужно ли писать тест, чтобы проверить, разрешен ли пользователь на этой странице индекса? Вот что у меня сейчас:

[Test]
public void Index_Should_Redirect_To_Error_View_When_User_Does_Not_Have_Permission()
{
}

[Test]
public void Index_Should_Log_Exception_When_User_Does_Not_Have_Permission()
{
}

[Test]
public void Index_Should_Return_Default_View()
{
   // Act
   var result = newsController.Index();

   // Assert
   result
      .AssertViewRendered()
      .ForView("Index");
}

ОБНОВЛЕНИЕ: Вот мой метод действия индекса:

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

Будем благодарны за любые приличные статьи или примеры кода. Также на MVC contrib примеры кода не очень полезны. Я хотел бы услышать как можно больше мнений.

Спасибо.

1 Ответ

1 голос
/ 05 декабря 2010

Необходимо проводить различие между юнит-тестами, интеграционными тестами и веб-тестами.Модульные тесты предназначены для тестирования различных компонентов вашего кода, таких как действия контроллера в отдельности.Интеграционные тесты предназначены для тестирования интеграции между вашим кодом и внешними компонентами, такими как хранилище, которое считывает и записывает данные из базы данных, а веб-тест предназначен для тестирования всего пользовательского сценария вашего приложения, такого как пользователь, набирающий некоторый адрес в адресной строкесвоего браузера, нажав на какую-нибудь кнопку, ...

MVCContrib.TestHelper и Rhino Mocks предназначены для упрощения ваших юнит-тестов.Таким образом, в вашем сценарии вы должны проверить действие контроллера Index.Без показа кода, который содержит это действие контроллера, сложно сказать, что именно нужно тестировать.В целом, что вы можете выполнить модульное тестирование в действии контроллера, так это то, что он проверяет входные данные, вызывает соответствующие методы в хранилище и в соответствии с результатами возвращает правильное представление.

Итак, давайте предположим, что у вас есть следующее индексное действие, которое вы хотите протестировать:

public class HomeController: Controller
{
    private readony INewRepository _repository;
    public HomeController(INewRepository repository)
    {
        _repository = repository;
    }

    public ActionResult Index()
    {
        var news = _repository.GetNews();
        return View(news);
    }
}

и соответствующий юнит-тест:

[TestClass]
public class HomeControllerTests : TestControllerBuilder
{
    private HomeController _sut;
    private INewsRepository _repositoryStub;

    [TestInitialize()]
    public void MyTestInitialize() 
    {
        _repositoryStub = MockRepository.GenerateStub<INewsRepository>();
        _sut = new UsersController(_repositoryStub);
        InitializeController(_sut);
    }

    [TestMethod]
    public void UsersController_Index_Should_Fetch_News_From_Repository()
    {
        // arrange
        var news = new News[0];
        _repositoryStub.Stub(x => x.GetNews()).Return(news);

        // act
        var actual = _sut.Index();

        // assert
        actual
            .AssertViewRendered()
            .WithViewData<News[]>()
            .ShouldBe(news);
    }
}

Насколько вашПредставления обеспокоены тем, что вам нужно будет написать веб-тесты, чтобы убедиться, что они ведут себя как положеноЗдесь вам могут помочь различные инструменты, такие как Selenium или прямое использование Веб-тесты , если у вас установлена ​​Ultimate версия Visual Studio.Стивен Сандерсон также предложил интересный подход для тестирования представлений, на которые вы можете взглянуть.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...