如何在C#/ASP.NET网站中使用NUnit GUI?

4
我有一个C#/ASP.NET网站,在App_Code目录中有一些代码(*.cs)文件。我想使用NUnit对它们进行测试。我已经编写了一个带有正确的[TestFixture]和[Test]注释的测试文件,并将其放在这里:App_Code/Test/TestClassName.cs。
我打开NUnit GUI来运行它,但它要求我选择一个.exe或.dll文件。在我的项目的bin文件夹中没有这个文件。我的项目成功运行,构建完成,但仍然没有exe或dll文件。我如何让NUnit GUI只运行那个类中的测试?
3个回答

4
我不建议将测试代码放在与生产环境相同的包中。您可能希望将测试类移动到库项目中,例如Business.UnitTest(如果有一种内置的方法来创建一个nUnit特定的项目,则使用该方法)。然后将App_Code目录中的业务类移动到另一个名为Business的项目中。让Business.UnitTest引用Business库。这应该可以使nUnit运行(我不相信nUnit针对网站运行,只针对库运行,但我不确定)。
对于您的网站,请添加对刚才创建的业务库的引用,以便您的生产代码可以访问业务库中的业务对象。您可能需要解决一些命名空间问题,但那不会太难。

1
这听起来像是一个很好的解决方案,但当我将代码从App_Code移动到类库时,它无法再访问HttpContext.Current。我有很多错误日志记录自动从这个对象中提取相关信息。没有了它,我需要为每个方法添加几个额外的输入参数,并将这些信息提取出来,或者我需要在类库之外放置try/catch并让异常冒泡到那里。这两个选项都似乎是不必要的重复和一般的丑陋。是否有解决方法,或者人们只是不经常使用或记录Web状态? - Amber Shah
我不知道人们有多经常记录网页状态,尝试从HttpContext.Current中获取信息并像你提到的那样将它们作为变量传递(你可以在库中的对象中使它们成为属性)。如果你真的不喜欢传递额外的变量,请尝试将HttpContext.Current本身作为参数传递(虽然我不太喜欢这种方法,它会产生糟糕的耦合),只需在页面顶部添加using System.Web(确保库中有对程序集的引用)。 - Chris L

3
.NET网站项目的技巧在于,代码文件通常不会在前期编译,而是在执行相应页面时进行编译。这就在测试方面提出了挑战,因为正如您所提到的,NUnit想要运行一个.exe.dll来进行测试。
解决这个问题的方法之一是将网站项目转换为Web应用程序;它们听起来类似,但工作方式不同。与不需要前期编译的网站相比,Web应用程序需要编译。因此,您将拥有一个或多个编译为程序集(.dll)或可执行文件(.exe)的项目。然后,NUnit可以连接到这些来运行测试。
为使其正常工作,您需要将可测试代码分离到另一个项目中;您的前端Web应用程序可以引用该其他项目以利用其中的代码。理想情况下,前端应该是逻辑和用户交互的薄层,真正的工作可以发送到第二个项目中。因此,第二个项目是您想要测试的项目。
您需要再有一个项目来包含测试 - 一般智慧是不要将测试放在被测试的代码相同的项目中。这个项目引用被测试的项目和NUnit,并包含测试本身。这个程序集是您将指示NUnit运行测试的程序集。

0
首先,您需要为测试创建一个新项目。如果您有任何内部类或属性,则应使用{{link1:InternalsVisibleToAttribute}},以便能够从测试项目中测试这些内容,而不是“真正”的项目。
此属性适用于整个程序集,因此建议将其放入“真正”程序集的 Assembly.info 文件中。
在测试项目内部,向您的“真实”程序集添加引用。
确保准确知道二进制文件(assembly.dll)的路径;
在 NUnit GUI 中打开您的 TestsProjectAssembly.dll,确保浏览到正确的文件夹;
您可能还希望 NUnit GUI 在每次测试运行时重新加载程序集(在选项属性中有一个选项可供选择);
运行您的测试。
绝对确保您的路径或可浏览的文件夹是生成测试项目的文件夹。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接