Модульное тестирование контроллеров MVC - PullRequest
14 голосов
/ 19 декабря 2011

Контроллер в моем приложении ASP.NET MVC предварительно заполняет данные формы, отображаемые моим представлением, в соответствии с несколькими довольно простыми правилами.

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

Может кто-нибудь предложить способы подойти к этому?

Все примеры контроллеров модульного тестирования, которые я нашел, казались очень тривиальными, например, проверка того, что они возвращают ожидаемый тип представления.Я не уверен, что даже вижу значение в этом.

Ответы [ 2 ]

21 голосов
/ 19 декабря 2011

Вы можете проверить, приведя возвращенный объект к соответствующему классу, вместо того, чтобы использовать их базовый класс (который возвращается по умолчанию)

Например, для проверки значения по умолчанию AccountController вы бы что-то сделаливот так:

var controller = new AccountController();
var result = controller.LogOn() as ViewResult;
var model = result.Model as LogOnModel;

Assert.IsTrue(model.RememberMe); // assuming you "pre-populated" enabled the checkbox

Проверка, заполнен ли возвращаемый объект правильными данными, не кажется мне «неестественным», или вы имели это в виду иначе?

12 голосов
/ 20 декабря 2011

Я бы согласился, что тестирование типа возвращаемого представления было бы несколько бессмысленным. Однако проверка того, что ожидаемое «представление» было возвращено вместе с его правильными данными, будет действительным контрольным примером IMO.

Например, вот специальный тестовый пример редактирования для контроллера редактирования. Обратите внимание, что в этом примере используются Moq и Nunit, но кроме этого он довольно прост.

Обратите внимание, что этот ViewResult приведен к ожидаемой модели представления, а затем сделаны утверждения относительно ожидаемого контакта.

Тест:

[Test]
public void Edit_Get_Should_Lookup_Contact_From_Repository_And_Return_Edit_View()
{
    // arrange
    var _repository = new Mock<IContactRepository>();

    var expectedContact = new Contact
    {
        First = "first",
        Last = "last",
        Email = "mail@test.com"
    };

    var mockContext = new Mock<ControllerContext>();
    _repository.Setup(x => x.GetById(It.IsAny<int>())).Returns(expectedContact);

    var controller = new ContactController(_repository.Object)
    {
        ControllerContext = mockContext.Object
    };

    // act
    var result = controller.Edit(1) as ViewResult;
    var resultData = (Contact)result.ViewData.Model;

    // assert
    Assert.AreEqual("Edit", result.ViewName);
    Assert.AreEqual(expectedContact.First, resultData.First);
    Assert.AreEqual(expectedContact.Last, resultData.Last);
    Assert.AreEqual(expectedContact.Email, resultData.Email);
}

Контроллер:

[HttpGet]
public ActionResult Edit(int id)
{
    var contact = _repository.GetById(id);

    return View("Edit", contact);
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...