对 ASP.Net Web 应用程序的App_Code进行单元测试

Unit Testing the App_Code of an ASP.Net Web Application

提问人:Kevin 提问时间:3/3/2017 最后编辑:CommunityKevin 更新时间:3/3/2017 访问量:1793

问:

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

重现步骤

(如果您已经知道如何创建默认的 Web窗体 Web 应用程序并添加app_code文件夹,请跳过图像)

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

enter image description here

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

enter image description here

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

enter image description here enter image description here

向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?)

其他说明

我查看了存储在 App_Code 中的单元测试 ASP.net 网站项目代码,但我认为问题与我的情况并不完全匹配,因为他们正在测试网站,而我正在测试 Web 应用程序。一些答案特别建议切换到 Web 应用程序,这意味着它不再是问题:

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

 

我要么将这个逻辑移到它自己的类库项目中,要么将项目类型更改为 Web 应用程序,正如 Fredrik 和 Colin 所建议的那样。

 

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

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

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

C# asp.net .NET 单元测试

评论

0赞 JuanR 3/3/2017
是否在单元测试项目中添加了对 Web 项目的引用?
0赞 mason 3/3/2017
在 Web 应用程序中不需要 App_Code 目录。那是针对网站项目。
3赞 Evk 3/3/2017
App_Code是特殊的文件夹,它不会在程序集中编译,而是在运行时由 asp.net 编译。因此,您不能从单元测试中引用它,实际上您甚至无法从 Web 应用程序程序集(例如来自 global.asax)使用它。所以 - 除非你知道你在做什么以及为什么,否则不要在该文件夹中放置任何东西。
0赞 Kevin 3/3/2017
@Juan,我试过了,但是 Web 应用程序在“添加引用”窗口的“项目”面板中不可见,并且 AFAIK Web 应用程序不会编译为 dll,因此我也无法使用“浏览”面板添加引用。
1赞 Evk 3/3/2017
如果要将App_Code文件用作常规文件,而不使用其预期用途(asp.net 运行时编译),只需右键单击App_Code下的 Util.cs 文件,选择“属性”并将“生成操作”从“内容”更改为“编译”。然后,您将能够在任何地方引用它,包括单元测试。这个文件夹名称并没有什么神奇之处。

答:

3赞 Evk 3/3/2017 #1

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

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

评论

0赞 Kevin 3/3/2017
我相信这准确地回答了我提出的问题。我看到如果我将我的文件移动到项目中的其他任何位置,那么我就可以正确地对其进行单元测试。我仍然在我没有在这里分享的非 mcve 项目中看到一些奇怪的行为,但我怀疑这是一个不相关的问题,应该与这个项目分开发布自己的帖子。关于这个特定问题的案件已经结案。util.cs
1赞 Evk 3/3/2017
请注意,您可以移动它或更改生成操作以编译它以使其按预期工作。
0赞 mason 3/3/2017
即使您使用的是 Web 窗体,也只需要App_Code当您正在制作网站(而不是 Web 应用程序)时。甚至可以做一个MVC网站,把你所有的控制器等都放在App_Code里。因此,与 Web 表单没有什么特别的关系。
0赞 Evk 3/3/2017
@mason没错,我删除了它。虽然我只见过它在旧的 Web 表单项目中使用,但从未在 mvc 项目中使用过。
0赞 mason 3/3/2017
@Evk 好吧,如果你移动了它,并且它没有设置为编译,那么你需要将其设置为编译。所以真正的解决方案是“将其设置为编译,最好不要将其放在App_Code中,以免混淆”。是的,当我试图将 MVC 放在网站项目而不是 Web 应用程序中时,我只是在学习 MVC。我不建议尝试。