避免在ASP.NET MVC中丢失视图

时间:2011-01-20 14:46:12

标签: asp.net-mvc hudson starteam

在测试ASP.NET MVC 2应用程序时,如果无法找到视图,我遇到了问题。

查看代码,我意识到视图的aspx文件尚未添加到源代码控制库中。在这个项目中,我们使用StarTeam进行源代码控制非常容易,而且在签入时它不显示新的文件夹。这个视图用于新的控制器,因此为它创建了一个新文件夹,因此错过了。< / p>

我们的构建服务器(使用Hudson / MSBuild)没有注意到这一点,因为代码仍然可以在缺少aspx文件的情况下正常构建。我们的控制器单元测试ActionResults,它显然仍然在没有视图的情况下通过。

这在系统测试中得到了提升,但我如何才能更早地捕获它(理想情况是在构建服务器上)。

提前致谢

3 个答案:

答案 0 :(得分:2)

您可以编写测试实际视图的单元测试,然后如果单元测试未在构建服务器上传递,则表示您遇到了问题。为此,您可以使用如下框架:
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"));
    });
}

答案 1 :(得分:1)

您正在运行什么版本的StarTeam?在选定项目/视图中的StarTeam 2008(不确定何时首次添加此功能)中,您可以从菜单Folder Tree->Show Not-In-View Folders中进行选择。这将显示您在本地磁盘上尚未添加到项目中的文件夹(它们将显示为文件夹图标为白色)。

答案 2 :(得分:0)

这是一个老问题,但如果有人仍然在寻找这个,你应该尝试SpecsFor.Mvc by Matt Honeycutt

它不仅可用于确保在源代码管理中正确包含/添加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");
        }
    }
}