我有一个单元测试尝试使用不正确的凭据登录,并检查生成的响应正文以查找某些特定的“errorbox”html。这很好用。
[Fact]
public void SignIn__Should_display_error_message_when_error_passed()
{
var browser = Fake.Browser();
var response = browser.Get("/signin", with => with.Query("error", "true"));
response.Body["#errorBox"]
.ShouldExistOnce()
.And.ShouldBeOfClass("floatingError")
.And.ShouldContain("invalid", StringComparison.InvariantCultureIgnoreCase);
}
我的页面有点重复,所以我重组了一些东西来创建一组简单的嵌套剃刀视图,如下所示:
登录视图
@inherits Nancy.ViewEngines.Razor.NancyRazorViewBase<dynamic>
@{
Layout = "_Master.cshtml";
}
<h3>Sign In</h3>
<form class="nice" method="POST">
... [labels, inputs etc]
</form>
@if (Model.HasError)
{
<div id="errorBox" class="floatingError">Invalid UserName or Password</div>
}
_Master视图
@inherits Nancy.ViewEngines.Razor.NancyRazorViewBase<dynamic>
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="utf-8" />
<title>@Model.Title</title>
... [css javascript etc]
@RenderSection("Head", required: false)
</head>
<body>
@RenderBody()
</body>
</html>
这仍然有效,我的单元测试仍然通过(请耐心等待)。时间过去了,代码变得更加复杂,所以现在我需要重新组织。我在剃刀视图中添加了另一层嵌套。
_Page View
@inherits Nancy.ViewEngines.Razor.NancyRazorViewBase<dynamic>
@{
Layout = "_Master.cshtml";
}
@section Head{
[... shared javascript, css]
@RenderSection("Head", required: false)
}
[.. some shared content]
@RenderBody()
双重嵌套看起来像这样:
登录 - &gt; _Page - &gt; _master
现在我的单元测试失败,因为响应不包含正确的html。在真实浏览器(chrome)中运行代码并手动提供不正确的凭据会产生正确的响应,只有单元测试失败。
向下钻取到response.Body.responseDocument.agilityPackDocumentInternal.DocumentNode.InnerHtml
会显示此异常:
错误编译模板:(15,11)无法找到类型或命名空间名称“XXXX”
将SignIn视图重新指向使用_Master作为其布局(剪切中间_Page视图)使单元测试再次通过。
然而_Page视图在代码方面没有任何作用,它只是添加了一些<script>
和<style>
标签并传递了接力棒。为了测试这些标签是否存在问题,我将它们移动到_Master视图并将嵌套保持在一个级别(SignIn - &gt; _Master)并且测试通过。
那么,Nancy.Testing
是否支持两级剃刀布局嵌套?否则,有人能发现我的错误吗?
谢谢
PS 我不知道它是否已连接但我怀疑视图缓存可能是问题(在阅读Test driving Nancy Modules之后)我检查了Nancy.StaticConfiguration.DisableCaches
的值果然,它设置为false
(尽管我的DEBUG
符号已打开并在调试模式下运行测试)。我在自定义单元测试BootStrapper类中将此值设置为true,但这没有任何区别。
protected override void ConfigureApplicationContainer(TinyIoCContainer container)
{
base.ConfigureApplicationContainer(container);
Nancy.StaticConfiguration.DisableCaches = true;
}
答案 0 :(得分:0)
这个问题的答案可以在我的跟进问题中找到:
Why does Nancy.Testing fail when @using statements are included in razor layouts?