在上一个问题Does Nancy.Testing support nested Razor views?中,我概述了当Nancy单元测试出现嵌套剃刀布局时遇到的困难。
经过调查,我现在可以改进这些信息了。问题与嵌套无关只是这样:如果在剃刀布局或视图中包含@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)类型或命名空间名称&#39; uMentor&#39;无法找到。
使用服务器端代码的主布局
@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(网站项目和单元测试项目)都具有正确的剃刀程序集和命名空间:
的Web.config
<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>
剥离一切,我可以建立最简单的“你好世界”。查看 - &gt;没有任何内容的布局,没有代码。单元测试通过(响应主体中有正确的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语句放入剃刀视图或布局会导致剃刀编译错误无效地失败,并在响应正文中返回错误消息。只有当您的测试恰好检查身体内容时才会发现存在问题。
感谢您的帮助。
答案 0 :(得分:3)
我的第一个猜测是将配置从web.config移动到app.config。 这对我有用,虽然我不知道为什么。
我也喜欢南希,这很棒,但文档很糟糕。正因为如此,当我开发Nancy应用程序时,我将它的源代码挂钩到项目中(当然只有相关部分),而且当我遇到任何问题时,我会进入Nancy的源代码并自己找到问题。代码写得很好,很容易阅读。
干杯!