Как избежать пропусков в 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");
}
}
}