Как избежать пропусков в ASP.NET MVC

При тестировании приложения ASP.NET MVC 2 я столкнулся с проблемой, когда представление не может быть найдено.

Глядя на код, я понял, что файл aspx для представления не был добавлен в репозиторий управления исходным кодом. В этом проекте это довольно просто сделать, так как мы используем StarTeam для контроля исходного кода, и он не показывает новые папки при регистрации. Это представление было для нового контроллера, поэтому для него была создана новая папка, и поэтому она была пропущена.

Наш сервер сборки (использующий Hudson/MSBuild) не понял этого, так как код по-прежнему прекрасно работает с отсутствующим файлом aspx. Наши тесты контроллеров проверяют ActionResults, которые, очевидно, все еще проходят без представления.

Это было обнаружено при тестировании системы, но как я могу поймать это раньше (в идеале на сервере сборки).

заранее спасибо

3 ответа

Решение

Вы можете написать модульные тесты, которые проверяют фактическое представление, и затем, если модульный тест не проходит на сервере сборки, вы знаете, что у вас есть проблема. Для этого вы можете использовать такую ​​структуру:
http://blog.stevensanderson.com/2009/06/11/integration-testing-your-aspnet-mvc-application/

С этим вы можете написать модульные тесты, такие как этот (из поста)

[Test]
public void Root_Url_Renders_Index_View()
{
    appHost.SimulateBrowsingSession(browsingSession => {
        // Request the root URL
        RequestResult result = browsingSession.ProcessRequest("/");

        // You can make assertions about the ActionResult...
        var viewResult = (ViewResult) result.ActionExecutedContext.Result;
        Assert.AreEqual("Index", viewResult.ViewName);
        Assert.AreEqual("Welcome to ASP.NET MVC!", viewResult.ViewData["Message"]);

        // ... or you can make assertions about the rendered HTML
        Assert.IsTrue(result.ResponseText.Contains("<!DOCTYPE html"));
    });
}

Какую версию StarTeam вы используете? В StarTeam 2008 (не уверен, когда эта функция была впервые добавлена) в выбранном проекте / представлении, вы можете выбрать из меню Folder Tree->Show Not-In-View Folders, Это покажет папки на локальном диске, которые не были добавлены в проект (они будут отображаться с белым цветом значка папки).

Это старый вопрос, но если кто-то все еще ищет это, вы должны попробовать SpecsFor.Mvc от Мэтта Ханикатта.

Мало того, что это может быть использовано, чтобы убедиться, что Views правильно включены / добавлены в систему контроля версий, она может даже выполнить интеграционный тест, чтобы убедиться, что Views действительны.

Ссылка на свой сайт: http://specsfor.com/SpecsForMvc/default.cshtml

Ссылка на пакет nuget: https://www.nuget.org/packages/SpecsFor.Mvc/

Ссылка на github: https://github.com/MattHoneycutt/SpecsFor

Вот фрагмент кода, взятый с сайта, показывающий, как его использовать.

public class UserRegistrationSpecs
{
    public class when_a_new_user_registers : SpecsFor<MvcWebApp>
    {
        protected override void Given()
        {
            SUT.NavigateTo<AccountController>(c => c.Register());
        }

        protected override void When()
        {
            SUT.FindFormFor<RegisterModel>()
                .Field(m => m.Email).SetValueTo("test@user.com")
                .Field(m => m.UserName).SetValueTo("Test User")
                .Field(m => m.Password).SetValueTo("P@ssword!")
                .Field(m => m.ConfirmPassword).SetValueTo("P@ssword!")
                .Submit();
        }

        [Test]
        public void then_it_redirects_to_the_home_page()
        {
            SUT.Route.ShouldMapTo<HomeController>(c => c.Index());
        }

        [Test]
        public void then_it_sends_the_user_an_email()
        {
            SUT.Mailbox().MailMessages.Count().ShouldEqual(1);
        }

        [Test]
        public void then_it_sends_to_the_right_address()
        {
            SUT.Mailbox().MailMessages[0].To[0].Address.ShouldEqual("test@user.com");
        }

        [Test]
        public void then_it_comes_from_the_expected_address()
        {
            SUT.Mailbox().MailMessages[0].From.Address.ShouldEqual("registration@specsfor.com");
        }
    }
} 
Другие вопросы по тегам