【问题标题】:Why does Nancy.Testing fail when @using statements are included in razor layouts?当 @using 语句包含在剃刀布局中时,为什么 Nancy.Testing 会失败?
【发布时间】:2012-08-16 15:29:30
【问题描述】:

在上一个问题Does Nancy.Testing support nested Razor views? 中,我概述了在呈现嵌套剃须刀布局时 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 程序集和命名空间:

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>

剥离一切,我可以构建最简单的“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 编译错误,该错误会静默失败,并在响应正文中返回错误消息。只有当你的测试碰巧检查了正文内容时,你才会发现有问题。

感谢您的帮助。

【问题讨论】:

    标签: unit-testing razor nancy


    【解决方案1】:

    我的第一个猜测是将配置从 web.config 移动到 app.config。 这对我有用,虽然我不知道为什么。

    我也喜欢南希,它很棒,但文档真的很烂。因此,当我开发 Nancy 应用程序时,我将它的源代码挂钩到项目中(当然只有相关部分),当我遇到任何问题时,我会进入 Nancy 的源代码并自己找到问题。代码写得很好,很容易阅读。

    干杯!

    【讨论】:

    • 我将所有配置转移到单元测试 app.config 并删除了 web.config,你知道吗 - 一切正常!谢谢。
    • @Dom 我知道这个答案已经过时了,但是 Nancy 团队在文档方面付出了巨大的努力。希望现在好多了:)
    猜你喜欢
    • 2013-02-22
    • 1970-01-01
    • 2012-08-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-03-04
    • 2012-12-02
    相关资源
    最近更新 更多