Модульное тестирование визуализированного представления в ASP.NET MVC - PullRequest
9 голосов
/ 10 марта 2011

Извините, что снова бью этот барабан, но я искал и искал способ модульного теста визуализированного представления в ASP.NET MVC (в настоящее время используется v2).

Я не на 100% удовлетворен использованием WatiN или Selenium для этого, они оба являются отличными инструментами, но слишком долго, чтобы выполнить тест для такого простого сценария, и тестируют намного больше, чем я необходимо.

Я также глубоко недоволен мантрой «Представления не должны проверяться», которая, по-видимому, вытекает из первопричины представлений в их текущем состоянии, просто не поддается тестированию вне более крупного интеграционного теста. :)

У меня уже есть тест на контроллере с "AssertViewRendered (). For (" Index "). WithViewData ()" и т. Д. Я просто хочу охватить, что данные отображаются представлением, когда оно включено Модель.

Представьте себе этот простой сценарий:

Контроллер:

public class SimpleController : Controller
{
    public void Index()
    {
        var vm = new SimpleViewModel { Message = "Hello world!" };
        return View(vm);
    }
}

А это простой вид модели:

public class SimpleViewModel
{
    public string Message { get; set; }
}

И простой вид:

`<%@ Page Language="C#"` `Inherits="System.Web.Mvc.ViewPage<SimpleViewModel>" %>`
    <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">

    <html xmlns="http://www.w3.org/1999/xhtml">
    <body>
        <h1><%= Model.Message %></h1>
    </body>
    </html>

Как мне автоматизировать с помощью простого модульного теста, что View фактически использует свойство Message, без необходимости использования таких инструментов тестирования интеграции с большим весом, как WatiN, и без веб-сервера?

Примерно так будет идеально:

    [TestMethod]
    public void ShouldDisplayMessage()
    {
        const string helloWorld = "Hello world!";
        var view = new SimpleView(new SimpleViewModel { Message = helloWorld });
        var result = view.GetRenderedString();
        Assert.IsTrue(result.Contains(helloWorld));
    }

1 Ответ

1 голос
/ 10 марта 2011

Эта проблема состоит в том, что ваш файл View содержит другую информацию, которая влияет на представление (также известное как разметка). Вы можете проверить модель представления на наличие правильной информации в модели представления, но я не уверен, что это именно то, что вы хотите.

Вы можете приводить свой ViewResult.ViewData.Model при просмотре модели и утверждении значений оттуда.

    [Test]
    public Test()
    {
        var homeController = new HomeController();
        var result = homeController.About() as ViewResult();
        Assert.IsInstanceOf(typeof(MyViewModel),result.ViewData.Model);
        var myModel = result.ViewData.Model as MyViewModel;
        Assert.That(myModel.Name,Is.EqualTo("Hello World")  );

    }

Если вы используете двигатель с искровым обзором, все может быть немного проще

http://darrell.mozingo.net/2010/01/28/in-memory-view-rendering-with-spark/

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