Модульные испытания Контроллеры MVC

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

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

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

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

Ответы

Ответ 1

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

Например, чтобы проверить значение по умолчанию 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

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

Ответ 2

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

Например, здесь есть специальный тестовый пример редактирования для контроллера редактирования. Обратите внимание, что этот пример использует 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 = "[email protected]"
    };

    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);
}