在上一个问题中,Nancy.Testing 是否支持嵌套的 Razor 视图?我概述了在呈现嵌套剃刀布局时 Nancy 单元测试失败时遇到的困难。
经过调查,我现在可以细化该信息。问题与嵌套无关,它很简单:如果您在 razor 布局或视图中包含 @using 语句,那么如果从单元测试访问,Nancy 将无法找到引用的命名空间。
例如:
主布局
@inherits Nancy.ViewEngines.Razor.NancyRazorViewBase<dynamic>
<!DOCTYPE html>
<html lang="en">
<head>
<title>Test</title>
</head>
<body>
@RenderBody()
</body>
</html>
看法
@inherits Nancy.ViewEngines.Razor.NancyRazorViewBase<dynamic>
@{
Layout = "Master.cshtml";
}
hello World
如您所料,这很好用。但是,如果我们现在在主布局中添加一些服务器端处理,因此需要 @using 语句,那么单元测试会失败(代码运行正常,只有单元测试失败):
错误编译模板:(15, 11) 找不到类型或命名空间名称“uMentor”。
带有服务器端代码的主布局
@inherits Nancy.ViewEngines.Razor.NancyRazorViewBase<dynamic>
@using uMentor.Extensions
<!DOCTYPE html>
<html lang="en">
<head>
<title>@Model.Title</title>
</head>
<body>
@{
var user = Html.GetCurrentUser();
}
@RenderBody()
</body>
</html>
我已确保我的 web.config(网站项目和单元测试项目)具有正确的 razor 程序集和提到的命名空间:
网页配置
<configSections>
<section name="razor" type="Nancy.ViewEngines.Razor.RazorConfigurationSection, Nancy.ViewEngines.Razor" />
</configSections>
<razor disableAutoIncludeModelNamespace="false">
<assemblies>
<add assembly="System, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" />
<add assembly="Nancy" />
<add assembly="uMentor" />
</assemblies>
<namespaces>
<add namespace="Nancy" />
<add namespace="uMentor" />
<add namespace="uMentor.Domain" />
<add namespace="uMentor.Extensions" />
</namespaces>
</razor>
剥离一切,我可以构建最简单的“hello world”视图 -> 布局,其中没有任何内容,没有代码。单元测试通过(响应正文中包含正确的 html)。然后我在视图或布局的顶部添加了一个冗余的@using 语句,测试失败(响应正文包含上面的错误消息)。
仅使用 @using 的主布局 - 失败
@inherits Nancy.ViewEngines.Razor.NancyRazorViewBase<dynamic>
@using uMentor.Extensions
<!DOCTYPE html>
<html lang="en">
<head>
<title>Test</title>
</head>
<body>
@RenderBody()
</body>
</html>
因此,证据表明,将 @using 语句放入 razor 视图或布局会导致 razor 编译错误,该错误会静默失败,并在响应正文中返回错误消息。只有当您的测试碰巧检查了正文内容时,您才会发现存在问题。
感谢您的任何帮助。