如何在ASP.NET网站(而不是Web项目)中使用NUnit?

3

我对单元测试还不熟悉,想尝试一下 NUnit。

在 ASP.NET Web 项目中,我可以为单元测试创建一个新的项目,并添加对原始项目的引用。在 NUnit 中,我可以加载我的单元测试项目的 dll 文件来运行测试。

然而,我正在开发一个 ASP.NET 网站,由于 ASP.NET 网站没有 dll 文件,我不能在解决方案中添加一个引用我的网站项目的独立项目,因此无法访问主项目中的类进行测试。即使我决定将测试留在主网站项目中,我也无法直接在 NUnit Gui 中加载网站的 dll(因为没有任何 dll 文件)。

我在使用 Visual Studio 为我的网站创建单元测试时也遇到了问题,不知道它们是否相关。

任何帮助都将不胜感激。

3个回答

4

为什么不能改用Web应用程序项目呢?或者,您可以将业务逻辑移动到外部类库项目中,然后在您的Nunit测试项目中引用后者。


可能可以使用网站的发布版本来实现。这样,您就有了一个 DLL,可以在 Nunit 测试项目中链接它。但是,这是一个相当笨拙的解决方案。我对网站项目的印象实际上是负面的。 - Kerido

2

是的,这是可能的。诀窍在于不使用NUnit GUI Runner,而是拥有自定义的ASP.net测试页面。以下是使用Razor的示例。以下内容放入App_Code\MyRunner.cs中:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using NUnit.Core;
using NUnit.Framework;
using NUnit.Core.Extensibility;

/// <summary>
/// Summary description for TestRunner
/// </summary>
public class MyRunner
{
    public static IList<TestResult> Run(Type testCase)
    {
        NUnit.Core.CoreExtensions.Host.InitializeService();
        TestExecutionContext.CurrentContext.TestPackage = new TestPackage(testCase.FullName);
        MyListener listener = new MyListener();
        if (TestFixtureBuilder.CanBuildFrom(testCase))
        {
            NUnit.Core.Test test = TestFixtureBuilder.BuildFrom(testCase);
            test.Run(listener, NUnit.Core.TestFilter.Empty);
        }
        return listener.Results;
    }
}

public class MyListener : EventListener
{

    public IList<TestResult> Results { get { return _results; } }

    public void RunFinished(Exception exception)
    {

    }

    public void RunFinished(TestResult result)
    {

    }

    public void RunStarted(string name, int testCount)
    {

    }

    public void SuiteFinished(TestResult result)
    {
    }

    public void SuiteStarted(TestName testName)
    {

    }

    IList<TestResult> _results = new List<TestResult>();
    public void TestFinished(TestResult result)
    {
        _results.Add(result);
    }

    public void TestOutput(TestOutput testOutput)
    {

    }

    public void TestStarted(TestName testName)
    {

    }

    public void UnhandledException(Exception exception)
    {

    }
}

public class Class1
{
    [Test]
    public void TestOnePlusOne()
    {
        Assert.AreEqual(1 + 1, 2);
    }

    [Test]
    public void TestOnePlusTwo()
    {
        throw new Exception("Ooops");
    }
}

这里是与之配套的CSHTML页面。将其命名为MyNUnit.cshtml:

@using NUnit.Core
@{
    IList<TestResult> results = MyRunner.Run(typeof(Class1));
}
<!DOCTYPE html>
<html>
<head>
    <title></title>
</head>
<body>
    <table>
        @foreach (TestResult result in results)
        {
            <tr>
                <td>
                    @result.Name
                </td>
                <td>
                    @result.IsSuccess
                </td>
                <td>
                    @result.Message
                </td>
            </tr>
        }
    </table>
</body>
</html>

-1
您可以通过以下方式提供您网站项目的参考:
引用 -> 项目 -> 添加项目。

你不能添加一个网站的引用。 - Steve

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