Модульные испытания Контроллеры 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);
}