当@using语句包含在剃刀布局中时,为什么Nancy.Testing会失败?

时间:2012-08-21 09:49:20

标签: unit-testing razor nancy

在上一个问题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语句放入剃刀视图或布局会导致剃刀编译错误无效地失败,并在响应正文中返回错误消息。只有当您的测试恰好检查身体内容时才会发现存在问题。

感谢您的帮助。

1 个答案:

答案 0 :(得分:3)

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

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

干杯!