【发布时间】: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