我有一个自定义的asp.net mvc类验证属性.我的问题是如何对其进行单元测试?测试类具有属性是一回事,但这实际上不会测试其中的逻辑.这是我想测试的.
[Serializable]
[EligabilityStudentDebtsAttribute(ErrorMessage = "You must answer yes or no to all questions")]
public class Eligability
{
[BooleanRequiredToBeTrue(ErrorMessage = "You must agree to the statements listed")]
public bool StatementAgree { get; set; }
[Required(ErrorMessage = "Please choose an option")]
public bool? Income { get; set; }
Run Code Online (Sandbox Code Playgroud)
.....为简洁而删除}
[AttributeUsage(AttributeTargets.Class)]
public class EligabilityStudentDebtsAttribute : ValidationAttribute
{
// If AnyDebts is true then
// StudentDebts must be true or false
public override bool IsValid(object value)
{
Eligability elig = (Eligability)value;
bool ok …Run Code Online (Sandbox Code Playgroud) 在这个单元测试中检查这么多东西有什么问题吗?:
ActualModel = ActualResult.AssertViewRendered() // check 1
.ForView("Index") // check 2
.WithViewData<List<Page>>(); // check 3
CollectionAssert.AreEqual(Expected, ActualModel); // check 4
Run Code Online (Sandbox Code Playgroud)
此测试的主要目标是验证返回正确的视图(检查2)并且它包含正确的数据(检查4).
我可以通过将其分成多个测试来获得任何收益吗?我一切都是为了做正确的事情,但如果它没有实际价值我就不会分手了.
我对单元测试很陌生,所以请保持温和.
如何压缩asp.net mvc应用程序发送的输出?
我试图将我可以在部分重用的所有内容分开,这样我就可以更容易地进行维护.
但是我得到了这个例外:无法直接请求文件"〜/ Views/Position/Edit.cshtml",因为它调用了"RenderSection"方法
我创建了一个名为sections.cshtml的文件,其中包含以下内容:
@section scripts{
<script src="@Url.Content("~/Scripts/jquery.validate.min.js")" type="text/javascript"></script>
<script src="@Url.Content("~/Scripts/jquery.validate.unobtrusive.min.js")" type="text/javascript"></script>
}
Run Code Online (Sandbox Code Playgroud)
在_layout.cshtml文件中,我将其更改为:
<head>
<meta charset="utf-8" />
<title>@ViewBag.Title</title>
<link href="@Url.Content("~/Content/Site.css")" rel="stylesheet" type="text/css" />
@RenderSection("scripts", required:false)
@*<script src="@Url.Content("~/Scripts/jquery-1.5.1.min.js")" type="text/javascript"></script>
<script src="@Url.Content("~/Scripts/modernizr-1.7.min.js")" type="text/javascript"></script>*@
</head>
Run Code Online (Sandbox Code Playgroud)
当我在浏览器中转到视图并检查它只显示的源代码时:
<head>
<meta charset="utf-8" />
<title>Edit</title>
<link href="/Content/Site.css" rel="stylesheet" type="text/css" />
</head>
Run Code Online (Sandbox Code Playgroud) 默认情况下,ASP.NET MVC 2.0将在操作尝试返回JSON以响应GET请求时抛出异常.我知道这可以通过使用JsonRequestBehavior.AllowGet逐个方法覆盖,但是可以在控制器或更高的基础上设置(可能是web.config)吗?
更新:Per Levi的评论,这是我最终使用的 -
protected override JsonResult Json(object data, string contentType, System.Text.Encoding contentEncoding)
{
return Json(data, contentType, JsonRequestBehavior.AllowGet);
}
Run Code Online (Sandbox Code Playgroud) 我目前在我的控制器中有一个方法,它接受表单集合,保存数据,然后在"详细信息"页面中显示数据.目前,代码目前看起来像:
[HttpPost]
public ActionResult Create(PersonModel person)<br>
{
if (person.IsValid())
{
person.additionalData = "Person created successfully";
return View("Details", person);
}
}
Run Code Online (Sandbox Code Playgroud)
问题是以这种方式返回Details视图会保留URL mysite/Person/Create - 理想情况下我希望URL为mysite/Person/Details/IdGoesHere.
我相信这一定是可能的.显然,我可以使用Response.Redirect,但是这不允许我将模型传递给视图.据我所知,我无法使用RedirectToAction传递模型?
谢谢您的帮助.
编辑:确认 - "创建"操作生成的模型与"详细信息"操作创建的默认模型不同.因此,直接重定向到Action并传递Id不起作用,因为生成的模型不正确.为了提供更多上下文,"创建"操作中的模型包含一个附加值,表示"人员已成功创建",如果我重定向到"详细信息"操作,则此消息不会出现在模型中.
我一整天都在努力在我的ASP.NET MVC 2应用程序中实现错误处理.我看过各种各样的技术,但都没有正常工作.我正在使用MVC2和.NET 4.0(在MVC3发布之前启动项目;我们将在发布初始版本后进行升级).
在这一点上,我将很乐意正确处理404和500错误 - 403(需要授权)也会很好,其次是各种其他特定的响应.现在,我得到所有404,全部500,全部302在404之前,或者全部302在500之前.
这是我的要求(应该非常接近HTTP的基本要求):
如果找不到资源,则抛出404,并显示包含所请求URL的特定于404的页面.不要返回像302这样的中间响应代码.理想情况下,保留请求的URL,而不是显示新的URL /Error/NotFound,但如果显示后者,请确保我们没有返回重定向响应来获取它.
如果发生内部服务器错误,则抛出500,并显示500特定错误,并指出出现了什么问题.同样,不要返回中间响应代码,理想情况下不要更改URL.
这是我认为的404:
/Content/non-existent-dir/non-existent-file.txt/non-existent-controller/Foo/666/Home/non-existent-action/666/Home/Login/non-existent-id这是我认为的500:
POST /User/New/new-user-name-too-long-for-db-column-constraint其中一些问题需要由特定的控制器或模型识别,然后控制器应抛出适当的HttpException.其余的应该更一般地处理.
对于404情况#2,如果找不到控制器,我尝试使用自定义ControllerFactory来抛出404.对于404#3案例,我试图使用自定义基本控制器来覆盖HandleUnknownAction并抛出404.
在这两种情况下,我在404之前得到302.而且,我从来没有得到500个错误; 如果我修改Web.config以在我的Web服务端点中输入拼写错误,我仍然得到302,然后404表示无法找到使用 Web服务的URL(控制器/操作).我还将请求的URL作为(不需要的)查询字符串参数获取:/Error/NotFound?aspxerrorpath=/Home/non-existent-action
这两种技术都来自http://www.niksmit.com/wp/?p=17(如何使用ASP.Net MVC获取正常的404(找不到页面)错误页面),来自http:// richarddingwall .名称/ 2008/08/17 /为基础的战略,为资源-404-错误-在-ASPNET-MVC /
如果在我的Web.config中<customErrors mode="On" defaultRedirect="~/Error/Unknown" redirectMode="ResponseRedirect" />,我得到了相应的响应代码,但我的错误控制器永远不会被调用.取出redirectMode属性可以获得MVC错误视图,但是介入302和更改的URL - 并且始终是相同的控制器(Unknown= 500;如果我将其更改为NotFound一切看起来像404).
以下是我已阅读并尝试实施的其他一些内容:
..以及一堆StackOverflow帖子.
在我看来,这种错误处理对于Web应用程序来说是非常基本的,并且MVC框架应该具有开箱即用的默认设置,并且让人们将其扩展为其他工作.也许他们会在将来的版本中做到这一点.在此期间,有人可以向我提供有关如何实施正确HTTP响应的全面详细信息吗?
我有一个Visual Studio 2010 MVC2 Web应用程序,我正在使用Hudson通过命令行构建.我想让Hudson发布一个Web输出,所以我将DeployOnBuild = true和CreatePackageOnPublish = True标记添加到我的命令行.
我的命令是:
C:\Windows\Microsoft.NET\Framework\v4.0.30319\MSBuild.exe
/target:Clean,Build
/property:Configuration=Debug;DeployOnBuild=True;CreatePackageOnPublish=True;
[my project name.csproj]
Run Code Online (Sandbox Code Playgroud)
在我的开发机器(Windows 7)上运行此命令成功发布了一个Web输出\obj\Debug\Package\PackageTmp\.但是在Hudson服务器(WS 2008)上运行它会成功编译,但它不会发布.相同的命令,相同版本的MSBuild,相同的源代码.
我已经尝试了/t:Publish目标,这给了我一个Skipping Unpublishable Project响应,正如我在其他几个人的帖子中看到的那样.
我已经尝试将DeployOnBuild=True和CreatePackageOnPublish=True标签添加到我的项目文件中,并且没有任何变化.
有关为什么不发布的任何想法?我错误地使用这些标签吗?我确信这里有一些我没看到的东西.
以下资源文件的最佳用法是什么?
我也想知道asp.net mvc应用程序中(1)和(2)之间的区别.
我想用生成Html.ActionLink的HTML ID 生成,这样我就可以根据我的位置更改CSS.我有一MasterPage组链接,我想区分活动的"Tab"和Jquery更改活动的#id的css
现在我正在使用:
<%: Html.ActionLink("Some View", "Index", "controller")%>
Run Code Online (Sandbox Code Playgroud)
它产生:
<a href="/controller">Some View</a>
Run Code Online (Sandbox Code Playgroud)
我想生成:
<a id="something" href="/controller">Some View</a>
Run Code Online (Sandbox Code Playgroud)
那可能吗?我试过了:
<%: Html.ActionLink("Some View", "Index", "controller", new {id="blahbla")%>
Run Code Online (Sandbox Code Playgroud)
但这会产生:
<a href="/controller/Length?5">Some View</a>
Run Code Online (Sandbox Code Playgroud) asp.net-mvc-2 ×10
asp.net-mvc ×6
asp.net ×3
c# ×3
unit-testing ×2
actionlink ×1
css ×1
gzip ×1
html-helper ×1
http ×1
httpresponse ×1
localization ×1
msbuild ×1
mstest ×1
publishing ×1
razor ×1
resx ×1
validation ×1