【问题标题】:Unit Testing the App_Code of an ASP.Net Web Application对 ASP.Net Web 应用程序的 App_Code 进行单元测试
【发布时间】:2017-07-22 12:16:44
【问题描述】:

我想创建一个 ASP.Net Web 应用程序,并且我想为它编写单元测试。但是我的单元测试项目在我的 Web 应用程序的 App_Code 目录中看不到任何类型。

重现步骤

(如果您已经知道如何创建默认 webforms 网络应用程序并添加 app_code 文件夹,请跳过图片)

打开 Visual Studio。选择文件->新建->项目。
选择模板 -> Visual C# -> Web。选择 ASP.Net Web 应用程序。选择“确定”。

选择“Web 表单”。选中“添加单元测试”。点击确定。

在解决方案资源管理器中,右键单击 Web 应用程序并选择“添加 -> 添加 ASP.Net 文件夹 -> App_Code”。

向 App_Code 添加一个名为“Util.cs”的新项目。向文件中添加一个函数,使其内容为:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;

namespace WebApplication1.App_Code
{
    public class Util
    {
        public static int getMeaningOfLife()
        {
            return 42;
        }
    }
}

在单元测试项目中,将 UnitTest1.cs 更改为:

using System;
using Microsoft.VisualStudio.TestTools.UnitTesting;

namespace WebApplication1.Tests
{
    [TestClass]
    public class UnitTest1
    {
        [TestMethod]
        public void TestMethod1()
        {
            int result = WebApplication1.App_Code.Util.getMeaningOfLife();
            if (result != 42)
            {
                Assert.Fail();
            }
        }
    }
}

然后构建项目。

预期行为:

解决方案应该构建。如果我们尝试测试,测试应该会成功。

实际行为:

使用The type or namespace name 'App_Code' does not exist in the namespace 'WebApplication1' (are you missing an assembly reference?) 构建解决方案失败

其他说明

我查看了Unit Testing ASP.net Web Site Project code stored in App_Code,但我认为这个问题与我的情况不完全相符,因为他们正在测试一个网站,而我正在测试一个 Web 应用程序。一些答案特别建议切换到 Web 应用程序,暗示这将不再是问题:

但是,如果您可以选择将代码分离为二进制文件(类库)或仅使用 Web 应用程序,我建议将其作为更好的选择。

 

按照 Fredrik 和 Colin 的建议,我要么将此逻辑移到它自己的类库项目中,要么将项目类型更改为 Web 应用程序

 

正如 OP 所说,也可以迁移到 Web App 项目,我会说这也更干净

“尝试使用网络应用程序”的建议不适用于我,因为我已经在使用网络应用程序,但它仍然不起作用。

答案还建议“尝试将代码移到自己的项目中”,我确实希望这会起作用,但在我的实际解决方案中,我在 App_Code 目录中有几十个文件。在我可以先建立测试框架之前,我不希望进行任何严重的结构更改。

【问题讨论】:

  • 你在单元测试项目中添加了对web项目的引用吗?
  • Web 应用程序中不需要 App_Code 目录。这是一个网站项目。
  • App_Code 是特殊文件夹,它不会在您的程序集中编译,而是由 asp.net 在运行时编译。所以你不能从单元测试中引用它,实际上你甚至不能从你的 web 应用程序程序集中使用它(例如来自 global.asax)。所以 - 除非您知道自己在做什么以及为什么,否则不要在该文件夹中放任何东西。
  • @Juan,我试过了,但是在“添加引用”窗口的“项目”面板中看不到 Web 应用程序,并且 AFAIK Web 应用程序不会编译为 dll,所以我无法添加也可以使用“浏览”面板进行参考。
  • 如果您想将 App_Code 文件用作常规文件,但没有预期用途(asp.net 运行时编译) - 只需右键单击 App_Code 下的 Util.cs 文件,选择 Properties 并更改 Build Action from "内容”到“编译”。然后您将能够在任何地方引用它,包括单元测试。该文件夹名称中并没有什么神奇之处。

标签: c# asp.net .net unit-testing


【解决方案1】:

所以要更清楚一点。 App_Code 文件夹在 asp.net 项目中具有特殊含义。您可以将文件放在那里,asp.net 将在运行时编译它们,并监控它们的变化,以便在发生变化时即时重新编译。细节不是很相关,主要是:如果你不需要这个功能 - 不要使用App_Code文件夹。

但是,该文件夹本身并没有什么神奇之处。当您通过“添加 ASP.NET 文件夹”(或仅在网站项目中手动)创建它时 - Visual Studio 会将您添加到 Content 的文件的构建操作设置为,即使对于代码文件也是如此。这些文件不会被编译成生成的程序集,这就是为什么你不能从你的单元测试项目中使用它们,甚至你也不能从网站代码本身使用它。如果您手动将构建操作更改为Compile - 它将被编译并可以照常使用。这就是所有的区别。

【讨论】:

  • 我相信这准确地回答了我提出的问题。我看到如果我将我的util.cs 文件移动到项目中的任何其他位置,那么我可以正确地对其进行单元测试。我仍然在我没有在这里分享的非 mcve 项目中看到一些特殊的行为,但我怀疑这是一个不相关的问题,并且应该有自己的帖子与这个问题分开。案件就此特定问题结束。
  • 请注意,您可以移动它或更改构建操作以编译它以使其按预期工作。
  • 即使您正在使用 Web 表单,如果您正在做一个网站(而不是 Web 应用程序),您也只需要 App_Code。甚至可以做一个 MVC 网站并将所有控制器等放在 App_Code 中。所以它与 Web 表单没什么特别的关系。
  • @mason 是的,我删除了它。虽然我什至只看到它用于旧的 Web 表单项目,但从未在 mvc 项目中使用。
  • @Evk 好吧,如果你移动它,并且它没有设置为编译,那么你需要将它设置为编译。所以真正的解决方案是“将其设置为编译,最好不要将它放在 App_Code 中以避免混淆”。是的,当我试图将它放在网站项目而不是 Web 应用程序中时,我只是在学习 MVC。我不建议尝试。
猜你喜欢
  • 1970-01-01
  • 2012-03-21
  • 2011-03-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-01-01
  • 2014-06-03
  • 1970-01-01
相关资源
最近更新 更多